xref: /libCEED/python/tests/test-2-elemrestriction.py (revision 0ef725981a32b9079ff6c5100673b913b8f4d7c0)
1*0ef72598Sjeremylt# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2*0ef72598Sjeremylt# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3*0ef72598Sjeremylt# reserved. See files LICENSE and NOTICE for details.
4*0ef72598Sjeremylt#
5*0ef72598Sjeremylt# This file is part of CEED, a collection of benchmarks, miniapps, software
6*0ef72598Sjeremylt# libraries and APIs for efficient high-order finite element and spectral
7*0ef72598Sjeremylt# element discretizations for exascale applications. For more information and
8*0ef72598Sjeremylt# source code availability see http://github.com/ceed.
9*0ef72598Sjeremylt#
10*0ef72598Sjeremylt# The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
11*0ef72598Sjeremylt# a collaborative effort of two U.S. Department of Energy organizations (Office
12*0ef72598Sjeremylt# of Science and the National Nuclear Security Administration) responsible for
13*0ef72598Sjeremylt# the planning and preparation of a capable exascale ecosystem, including
14*0ef72598Sjeremylt# software, applications, hardware, advanced system engineering and early
15*0ef72598Sjeremylt# testbed platforms, in support of the nation's exascale computing imperative.
16*0ef72598Sjeremylt
17*0ef72598Sjeremylt# @file
18*0ef72598Sjeremylt# Test Ceed ElemRestriction functionality
19*0ef72598Sjeremylt
20*0ef72598Sjeremyltimport os
21*0ef72598Sjeremyltimport libceed
22*0ef72598Sjeremyltimport numpy as np
23*0ef72598Sjeremyltimport check
24*0ef72598Sjeremylt
25*0ef72598Sjeremylt# -------------------------------------------------------------------------------
26*0ef72598Sjeremylt# Test creation, use, and destruction of an element restriction
27*0ef72598Sjeremylt# -------------------------------------------------------------------------------
28*0ef72598Sjeremylt
29*0ef72598Sjeremylt
30*0ef72598Sjeremyltdef test_200(ceed_resource):
31*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
32*0ef72598Sjeremylt
33*0ef72598Sjeremylt    ne = 3
34*0ef72598Sjeremylt
35*0ef72598Sjeremylt    x = ceed.Vector(ne + 1)
36*0ef72598Sjeremylt    a = np.arange(10, 10 + ne + 1, dtype="float64")
37*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
38*0ef72598Sjeremylt
39*0ef72598Sjeremylt    ind = np.zeros(2 * ne, dtype="int32")
40*0ef72598Sjeremylt    for i in range(ne):
41*0ef72598Sjeremylt        ind[2 * i + 0] = i
42*0ef72598Sjeremylt        ind[2 * i + 1] = i + 1
43*0ef72598Sjeremylt    r = ceed.ElemRestriction(ne, 2, 1, 1, ne + 1, ind,
44*0ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
45*0ef72598Sjeremylt
46*0ef72598Sjeremylt    y = ceed.Vector(2 * ne)
47*0ef72598Sjeremylt    y.set_value(0)
48*0ef72598Sjeremylt
49*0ef72598Sjeremylt    r.apply(x, y)
50*0ef72598Sjeremylt
51*0ef72598Sjeremylt    with y.array_read() as y_array:
52*0ef72598Sjeremylt        for i in range(2 * ne):
53*0ef72598Sjeremylt            assert 10 + (i + 1) // 2 == y_array[i]
54*0ef72598Sjeremylt
55*0ef72598Sjeremylt# -------------------------------------------------------------------------------
56*0ef72598Sjeremylt# Test creation, use, and destruction of a strided element restriction
57*0ef72598Sjeremylt# -------------------------------------------------------------------------------
58*0ef72598Sjeremylt
59*0ef72598Sjeremylt
60*0ef72598Sjeremyltdef test_201(ceed_resource):
61*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
62*0ef72598Sjeremylt
63*0ef72598Sjeremylt    ne = 3
64*0ef72598Sjeremylt
65*0ef72598Sjeremylt    x = ceed.Vector(2 * ne)
66*0ef72598Sjeremylt    a = np.arange(10, 10 + 2 * ne, dtype="float64")
67*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
68*0ef72598Sjeremylt
69*0ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
70*0ef72598Sjeremylt    r = ceed.StridedElemRestriction(ne, 2, 1, 2 * ne, strides)
71*0ef72598Sjeremylt
72*0ef72598Sjeremylt    y = ceed.Vector(2 * ne)
73*0ef72598Sjeremylt    y.set_value(0)
74*0ef72598Sjeremylt
75*0ef72598Sjeremylt    r.apply(x, y)
76*0ef72598Sjeremylt
77*0ef72598Sjeremylt    with y.array_read() as y_array:
78*0ef72598Sjeremylt        for i in range(2 * ne):
79*0ef72598Sjeremylt            assert 10 + i == y_array[i]
80*0ef72598Sjeremylt
81*0ef72598Sjeremylt# -------------------------------------------------------------------------------
82*0ef72598Sjeremylt# Test creation and destruction of a blocked element restriction
83*0ef72598Sjeremylt# -------------------------------------------------------------------------------
84*0ef72598Sjeremylt
85*0ef72598Sjeremylt
86*0ef72598Sjeremyltdef test_202(ceed_resource, capsys):
87*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
88*0ef72598Sjeremylt
89*0ef72598Sjeremylt    ne = 8
90*0ef72598Sjeremylt    blksize = 5
91*0ef72598Sjeremylt
92*0ef72598Sjeremylt    x = ceed.Vector(ne + 1)
93*0ef72598Sjeremylt    a = np.arange(10, 10 + ne + 1, dtype="float64")
94*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
95*0ef72598Sjeremylt
96*0ef72598Sjeremylt    ind = np.zeros(2 * ne, dtype="int32")
97*0ef72598Sjeremylt    for i in range(ne):
98*0ef72598Sjeremylt        ind[2 * i + 0] = i
99*0ef72598Sjeremylt        ind[2 * i + 1] = i + 1
100*0ef72598Sjeremylt    r = ceed.BlockedElemRestriction(ne, 2, blksize, 1, 1, ne + 1, ind,
101*0ef72598Sjeremylt                                    cmode=libceed.USE_POINTER)
102*0ef72598Sjeremylt
103*0ef72598Sjeremylt    y = ceed.Vector(2 * blksize * 2)
104*0ef72598Sjeremylt    y.set_value(0)
105*0ef72598Sjeremylt
106*0ef72598Sjeremylt    r.apply(x, y)
107*0ef72598Sjeremylt
108*0ef72598Sjeremylt    print(y)
109*0ef72598Sjeremylt
110*0ef72598Sjeremylt    x.set_value(0)
111*0ef72598Sjeremylt    r.T.apply(y, x)
112*0ef72598Sjeremylt    print(x)
113*0ef72598Sjeremylt
114*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
115*0ef72598Sjeremylt    assert not stderr
116*0ef72598Sjeremylt    assert stdout == ref_stdout
117*0ef72598Sjeremylt
118*0ef72598Sjeremylt# -------------------------------------------------------------------------------
119*0ef72598Sjeremylt# Test creation, use, and destruction of a blocked element restriction
120*0ef72598Sjeremylt# -------------------------------------------------------------------------------
121*0ef72598Sjeremylt
122*0ef72598Sjeremylt
123*0ef72598Sjeremyltdef test_208(ceed_resource, capsys):
124*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
125*0ef72598Sjeremylt
126*0ef72598Sjeremylt    ne = 8
127*0ef72598Sjeremylt    blksize = 5
128*0ef72598Sjeremylt
129*0ef72598Sjeremylt    x = ceed.Vector(ne + 1)
130*0ef72598Sjeremylt    a = np.arange(10, 10 + ne + 1, dtype="float64")
131*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
132*0ef72598Sjeremylt
133*0ef72598Sjeremylt    ind = np.zeros(2 * ne, dtype="int32")
134*0ef72598Sjeremylt    for i in range(ne):
135*0ef72598Sjeremylt        ind[2 * i + 0] = i
136*0ef72598Sjeremylt        ind[2 * i + 1] = i + 1
137*0ef72598Sjeremylt    r = ceed.BlockedElemRestriction(ne, 2, blksize, 1, 1, ne + 1, ind,
138*0ef72598Sjeremylt                                    cmode=libceed.USE_POINTER)
139*0ef72598Sjeremylt
140*0ef72598Sjeremylt    y = ceed.Vector(blksize * 2)
141*0ef72598Sjeremylt    y.set_value(0)
142*0ef72598Sjeremylt
143*0ef72598Sjeremylt    r.apply_block(1, x, y)
144*0ef72598Sjeremylt
145*0ef72598Sjeremylt    print(y)
146*0ef72598Sjeremylt
147*0ef72598Sjeremylt    x.set_value(0)
148*0ef72598Sjeremylt    r.T.apply_block(1, y, x)
149*0ef72598Sjeremylt    print(x)
150*0ef72598Sjeremylt
151*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
152*0ef72598Sjeremylt    assert not stderr
153*0ef72598Sjeremylt    assert stdout == ref_stdout
154*0ef72598Sjeremylt
155*0ef72598Sjeremylt# -------------------------------------------------------------------------------
156*0ef72598Sjeremylt# Test getting the multiplicity of the indices in an element restriction
157*0ef72598Sjeremylt# -------------------------------------------------------------------------------
158*0ef72598Sjeremylt
159*0ef72598Sjeremylt
160*0ef72598Sjeremyltdef test_209(ceed_resource):
161*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
162*0ef72598Sjeremylt
163*0ef72598Sjeremylt    ne = 3
164*0ef72598Sjeremylt
165*0ef72598Sjeremylt    ind = np.zeros(4 * ne, dtype="int32")
166*0ef72598Sjeremylt    for i in range(ne):
167*0ef72598Sjeremylt        ind[4 * i + 0] = i * 3 + 0
168*0ef72598Sjeremylt        ind[4 * i + 1] = i * 3 + 1
169*0ef72598Sjeremylt        ind[4 * i + 2] = i * 3 + 2
170*0ef72598Sjeremylt        ind[4 * i + 3] = i * 3 + 3
171*0ef72598Sjeremylt    r = ceed.ElemRestriction(ne, 4, 1, 1, 3 * ne + 1, ind,
172*0ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
173*0ef72598Sjeremylt
174*0ef72598Sjeremylt    mult = r.get_multiplicity()
175*0ef72598Sjeremylt
176*0ef72598Sjeremylt    with mult.array_read() as mult_array:
177*0ef72598Sjeremylt        for i in range(3 * ne + 1):
178*0ef72598Sjeremylt            val = 1 + (1 if (i > 0 and i < 3 * ne and i % 3 == 0) else 0)
179*0ef72598Sjeremylt            assert val == mult_array[i]
180*0ef72598Sjeremylt
181*0ef72598Sjeremylt# -------------------------------------------------------------------------------
182*0ef72598Sjeremylt# Test creation and view of an element restriction
183*0ef72598Sjeremylt# -------------------------------------------------------------------------------
184*0ef72598Sjeremylt
185*0ef72598Sjeremylt
186*0ef72598Sjeremyltdef test_210(ceed_resource, capsys):
187*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
188*0ef72598Sjeremylt
189*0ef72598Sjeremylt    ne = 3
190*0ef72598Sjeremylt
191*0ef72598Sjeremylt    ind = np.zeros(2 * ne, dtype="int32")
192*0ef72598Sjeremylt    for i in range(ne):
193*0ef72598Sjeremylt        ind[2 * i + 0] = i + 0
194*0ef72598Sjeremylt        ind[2 * i + 1] = i + 1
195*0ef72598Sjeremylt    r = ceed.ElemRestriction(ne, 2, 1, 1, ne + 1, ind,
196*0ef72598Sjeremylt                             cmode=libceed.USE_POINTER)
197*0ef72598Sjeremylt
198*0ef72598Sjeremylt    print(r)
199*0ef72598Sjeremylt
200*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
201*0ef72598Sjeremylt    assert not stderr
202*0ef72598Sjeremylt    assert stdout == ref_stdout
203*0ef72598Sjeremylt
204*0ef72598Sjeremylt# -------------------------------------------------------------------------------
205*0ef72598Sjeremylt# Test creation and view of a strided element restriction
206*0ef72598Sjeremylt# -------------------------------------------------------------------------------
207*0ef72598Sjeremylt
208*0ef72598Sjeremylt
209*0ef72598Sjeremyltdef test_211(ceed_resource, capsys):
210*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
211*0ef72598Sjeremylt
212*0ef72598Sjeremylt    ne = 3
213*0ef72598Sjeremylt
214*0ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
215*0ef72598Sjeremylt    r = ceed.StridedElemRestriction(ne, 2, 1, ne + 1, strides)
216*0ef72598Sjeremylt
217*0ef72598Sjeremylt    print(r)
218*0ef72598Sjeremylt
219*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
220*0ef72598Sjeremylt    assert not stderr
221*0ef72598Sjeremylt    assert stdout == ref_stdout
222*0ef72598Sjeremylt
223*0ef72598Sjeremylt# -------------------------------------------------------------------------------
224*0ef72598Sjeremylt# Test creation and view of a blocked strided element restriction
225*0ef72598Sjeremylt# -------------------------------------------------------------------------------
226*0ef72598Sjeremylt
227*0ef72598Sjeremylt
228*0ef72598Sjeremyltdef test_212(ceed_resource, capsys):
229*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
230*0ef72598Sjeremylt
231*0ef72598Sjeremylt    ne = 3
232*0ef72598Sjeremylt
233*0ef72598Sjeremylt    strides = np.array([1, 2, 2], dtype="int32")
234*0ef72598Sjeremylt    r = ceed.BlockedStridedElemRestriction(ne, 2, 2, 1, ne + 1, strides)
235*0ef72598Sjeremylt
236*0ef72598Sjeremylt    print(r)
237*0ef72598Sjeremylt
238*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
239*0ef72598Sjeremylt    assert not stderr
240*0ef72598Sjeremylt    assert stdout == ref_stdout
241*0ef72598Sjeremylt
242*0ef72598Sjeremylt# -------------------------------------------------------------------------------
243