xref: /libCEED/python/tests/test-1-vector.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 Vector functionality
19*0ef72598Sjeremylt
20*0ef72598Sjeremyltimport os
21*0ef72598Sjeremyltimport libceed
22*0ef72598Sjeremyltimport numpy as np
23*0ef72598Sjeremyltimport check
24*0ef72598Sjeremylt
25*0ef72598Sjeremylt# -------------------------------------------------------------------------------
26*0ef72598Sjeremylt# Utility
27*0ef72598Sjeremylt# -------------------------------------------------------------------------------
28*0ef72598Sjeremylt
29*0ef72598Sjeremylt
30*0ef72598Sjeremyltdef check_values(ceed, x, value):
31*0ef72598Sjeremylt    with x.array_read() as b:
32*0ef72598Sjeremylt        for i in range(len(b)):
33*0ef72598Sjeremylt            assert b[i] == value
34*0ef72598Sjeremylt
35*0ef72598Sjeremylt# -------------------------------------------------------------------------------
36*0ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector
37*0ef72598Sjeremylt# -------------------------------------------------------------------------------
38*0ef72598Sjeremylt
39*0ef72598Sjeremylt
40*0ef72598Sjeremyltdef test_100(ceed_resource):
41*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
42*0ef72598Sjeremylt
43*0ef72598Sjeremylt    n = 10
44*0ef72598Sjeremylt    x = ceed.Vector(n)
45*0ef72598Sjeremylt
46*0ef72598Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
47*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
48*0ef72598Sjeremylt
49*0ef72598Sjeremylt    with x.array_read() as b:
50*0ef72598Sjeremylt        for i in range(n):
51*0ef72598Sjeremylt            assert b[i] == 10 + i
52*0ef72598Sjeremylt
53*0ef72598Sjeremylt# -------------------------------------------------------------------------------
54*0ef72598Sjeremylt# Test setValue
55*0ef72598Sjeremylt# -------------------------------------------------------------------------------
56*0ef72598Sjeremylt
57*0ef72598Sjeremylt
58*0ef72598Sjeremyltdef test_101(ceed_resource):
59*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
60*0ef72598Sjeremylt    n = 10
61*0ef72598Sjeremylt    x = ceed.Vector(n)
62*0ef72598Sjeremylt    value = 1
63*0ef72598Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
64*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
65*0ef72598Sjeremylt
66*0ef72598Sjeremylt    with x.array() as b:
67*0ef72598Sjeremylt        for i in range(len(b)):
68*0ef72598Sjeremylt            assert b[i] == 10 + i
69*0ef72598Sjeremylt
70*0ef72598Sjeremylt    x.set_value(3.0)
71*0ef72598Sjeremylt    check_values(ceed, x, 3.0)
72*0ef72598Sjeremylt    del x
73*0ef72598Sjeremylt
74*0ef72598Sjeremylt    x = ceed.Vector(n)
75*0ef72598Sjeremylt    # Set value before setting or getting the array
76*0ef72598Sjeremylt    x.set_value(5.0)
77*0ef72598Sjeremylt    check_values(ceed, x, 5.0)
78*0ef72598Sjeremylt
79*0ef72598Sjeremylt# -------------------------------------------------------------------------------
80*0ef72598Sjeremylt# Test getArrayRead state counter
81*0ef72598Sjeremylt# -------------------------------------------------------------------------------
82*0ef72598Sjeremylt
83*0ef72598Sjeremylt
84*0ef72598Sjeremyltdef test_102(ceed_resource):
85*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
86*0ef72598Sjeremylt
87*0ef72598Sjeremylt    n = 10
88*0ef72598Sjeremylt    x = ceed.Vector(n)
89*0ef72598Sjeremylt
90*0ef72598Sjeremylt    # Two read accesses should not generate an error
91*0ef72598Sjeremylt    a = x.get_array_read()
92*0ef72598Sjeremylt    b = x.get_array_read()
93*0ef72598Sjeremylt
94*0ef72598Sjeremylt    x.restore_array_read()
95*0ef72598Sjeremylt    x.restore_array_read()
96*0ef72598Sjeremylt
97*0ef72598Sjeremylt# -------------------------------------------------------------------------------
98*0ef72598Sjeremylt# Test setting one vector from array of another vector
99*0ef72598Sjeremylt# -------------------------------------------------------------------------------
100*0ef72598Sjeremylt
101*0ef72598Sjeremylt
102*0ef72598Sjeremyltdef test_103(ceed_resource):
103*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
104*0ef72598Sjeremylt
105*0ef72598Sjeremylt    n = 10
106*0ef72598Sjeremylt
107*0ef72598Sjeremylt    x = ceed.Vector(n)
108*0ef72598Sjeremylt    y = ceed.Vector(n)
109*0ef72598Sjeremylt
110*0ef72598Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
111*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
112*0ef72598Sjeremylt
113*0ef72598Sjeremylt    with x.array() as x_array:
114*0ef72598Sjeremylt        y.set_array(x_array, cmode=libceed.USE_POINTER)
115*0ef72598Sjeremylt
116*0ef72598Sjeremylt    with y.array_read() as y_array:
117*0ef72598Sjeremylt        for i in range(n):
118*0ef72598Sjeremylt            assert y_array[i] == 10 + i
119*0ef72598Sjeremylt
120*0ef72598Sjeremylt# -------------------------------------------------------------------------------
121*0ef72598Sjeremylt# Test getArray to modify array
122*0ef72598Sjeremylt# -------------------------------------------------------------------------------
123*0ef72598Sjeremylt
124*0ef72598Sjeremylt
125*0ef72598Sjeremyltdef test_104(ceed_resource):
126*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
127*0ef72598Sjeremylt
128*0ef72598Sjeremylt    n = 10
129*0ef72598Sjeremylt
130*0ef72598Sjeremylt    x = ceed.Vector(n)
131*0ef72598Sjeremylt    a = np.zeros(n, dtype="float64")
132*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
133*0ef72598Sjeremylt
134*0ef72598Sjeremylt    with x.array() as b:
135*0ef72598Sjeremylt        b[3] = -3.14
136*0ef72598Sjeremylt
137*0ef72598Sjeremylt    assert a[3] == -3.14
138*0ef72598Sjeremylt
139*0ef72598Sjeremylt# -------------------------------------------------------------------------------
140*0ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using
141*0ef72598Sjeremylt#   CEED_MEM_DEVICE
142*0ef72598Sjeremylt# -------------------------------------------------------------------------------
143*0ef72598Sjeremylt
144*0ef72598Sjeremylt
145*0ef72598Sjeremyltdef test_105(ceed_resource):
146*0ef72598Sjeremylt    # Skip test for non-GPU backend
147*0ef72598Sjeremylt    if 'gpu' in ceed_resource:
148*0ef72598Sjeremylt        ceed = libceed.Ceed(ceed_resource)
149*0ef72598Sjeremylt
150*0ef72598Sjeremylt        n = 10
151*0ef72598Sjeremylt        x = ceed.Vector(n)
152*0ef72598Sjeremylt        y = ceed.Vector(n)
153*0ef72598Sjeremylt
154*0ef72598Sjeremylt        a = np.arange(10, 10 + n, dtype="float64")
155*0ef72598Sjeremylt        x.set_array(a, cmode=libceed.USE_POINTER)
156*0ef72598Sjeremylt
157*0ef72598Sjeremylt        arr = x.get_array_read(memtype=libceed.MEM_DEVICE)
158*0ef72598Sjeremylt        y.set_array(arr, memtype=libceed.MEM_DEVICE)
159*0ef72598Sjeremylt        x.restore_array_read()
160*0ef72598Sjeremylt
161*0ef72598Sjeremylt        with y.array_read() as b:
162*0ef72598Sjeremylt            for i in range(n):
163*0ef72598Sjeremylt                assert b[i] == 10 + i
164*0ef72598Sjeremylt
165*0ef72598Sjeremylt# -------------------------------------------------------------------------------
166*0ef72598Sjeremylt# Test view
167*0ef72598Sjeremylt# -------------------------------------------------------------------------------
168*0ef72598Sjeremylt
169*0ef72598Sjeremylt
170*0ef72598Sjeremyltdef test_107(ceed_resource, capsys):
171*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
172*0ef72598Sjeremylt
173*0ef72598Sjeremylt    n = 10
174*0ef72598Sjeremylt    x = ceed.Vector(n)
175*0ef72598Sjeremylt
176*0ef72598Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
177*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
178*0ef72598Sjeremylt
179*0ef72598Sjeremylt    print(x)
180*0ef72598Sjeremylt
181*0ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
182*0ef72598Sjeremylt    assert not stderr
183*0ef72598Sjeremylt    assert stdout == ref_stdout
184*0ef72598Sjeremylt
185*0ef72598Sjeremylt# -------------------------------------------------------------------------------
186*0ef72598Sjeremylt# Test norms
187*0ef72598Sjeremylt# -------------------------------------------------------------------------------
188*0ef72598Sjeremylt
189*0ef72598Sjeremylt
190*0ef72598Sjeremyltdef test_108(ceed_resource, capsys):
191*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
192*0ef72598Sjeremylt
193*0ef72598Sjeremylt    n = 10
194*0ef72598Sjeremylt    x = ceed.Vector(n)
195*0ef72598Sjeremylt
196*0ef72598Sjeremylt    a = np.arange(0, n, dtype="float64")
197*0ef72598Sjeremylt    for i in range(n):
198*0ef72598Sjeremylt        if (i % 2 == 0):
199*0ef72598Sjeremylt            a[i] *= -1
200*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
201*0ef72598Sjeremylt
202*0ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_1)
203*0ef72598Sjeremylt
204*0ef72598Sjeremylt    assert abs(norm - 45.) < 1e-14
205*0ef72598Sjeremylt
206*0ef72598Sjeremylt    norm = x.norm()
207*0ef72598Sjeremylt
208*0ef72598Sjeremylt    assert abs(norm - np.sqrt(285.)) < 1e-14
209*0ef72598Sjeremylt
210*0ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_MAX)
211*0ef72598Sjeremylt
212*0ef72598Sjeremylt    assert abs(norm - 9.) < 1e-14
213*0ef72598Sjeremylt
214*0ef72598Sjeremylt# -------------------------------------------------------------------------------
215*0ef72598Sjeremylt# Test taking the reciprocal of a vector
216*0ef72598Sjeremylt# -------------------------------------------------------------------------------
217*0ef72598Sjeremylt
218*0ef72598Sjeremylt
219*0ef72598Sjeremyltdef test_119(ceed_resource):
220*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
221*0ef72598Sjeremylt
222*0ef72598Sjeremylt    n = 10
223*0ef72598Sjeremylt    x = ceed.Vector(n)
224*0ef72598Sjeremylt
225*0ef72598Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
226*0ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
227*0ef72598Sjeremylt    x.reciprocal()
228*0ef72598Sjeremylt
229*0ef72598Sjeremylt    with x.array_read() as b:
230*0ef72598Sjeremylt        for i in range(n):
231*0ef72598Sjeremylt            assert abs(b[i] - 1. / (10 + i)) < 1e-15
232*0ef72598Sjeremylt
233*0ef72598Sjeremylt# -------------------------------------------------------------------------------
234*0ef72598Sjeremylt# Test modification of reshaped array
235*0ef72598Sjeremylt# -------------------------------------------------------------------------------
236*0ef72598Sjeremylt
237*0ef72598Sjeremylt
238*0ef72598Sjeremyltdef test_199(ceed_resource):
239*0ef72598Sjeremylt    """Modification of reshaped array"""
240*0ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
241*0ef72598Sjeremylt
242*0ef72598Sjeremylt    vec = ceed.Vector(12)
243*0ef72598Sjeremylt    with vec.array(4, 3) as x:
244*0ef72598Sjeremylt        x[...] = np.eye(4, 3)
245*0ef72598Sjeremylt
246*0ef72598Sjeremylt    with vec.array_read(3, 4) as x:
247*0ef72598Sjeremylt        assert np.all(x == np.eye(4, 3).reshape(3, 4))
248*0ef72598Sjeremylt
249*0ef72598Sjeremylt# -------------------------------------------------------------------------------
250