xref: /libCEED/python/tests/test-1-vector.py (revision e735508cdfa08f2ead7f8e6e8f825d0fa851c858)
1# Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors
2# All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3#
4# SPDX-License-Identifier: BSD-2-Clause
5#
6# This file is part of CEED:  http://github.com/ceed
7
8# @file
9# Test Ceed Vector functionality
10
11import os
12import libceed
13import numpy as np
14import check
15
16TOL = libceed.EPSILON * 256
17
18# -------------------------------------------------------------------------------
19# Utility
20# -------------------------------------------------------------------------------
21
22
23def check_values(ceed, x, value):
24    with x.array_read() as b:
25        for i in range(len(b)):
26            assert b[i] == value
27
28# -------------------------------------------------------------------------------
29# Test creation, setting, reading, restoring, and destroying of a vector
30# -------------------------------------------------------------------------------
31
32
33def test_100(ceed_resource):
34    ceed = libceed.Ceed(ceed_resource)
35
36    n = 10
37    x = ceed.Vector(n)
38
39    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
40    x.set_array(a, cmode=libceed.USE_POINTER)
41
42    with x.array_read() as b:
43        for i in range(n):
44            assert b[i] == 10 + i
45
46# -------------------------------------------------------------------------------
47# Test setValue
48# -------------------------------------------------------------------------------
49
50
51def test_101(ceed_resource):
52    ceed = libceed.Ceed(ceed_resource)
53    n = 10
54    x = ceed.Vector(n)
55    value = 1
56    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
57    x.set_array(a, cmode=libceed.USE_POINTER)
58
59    with x.array() as b:
60        for i in range(len(b)):
61            assert b[i] == 10 + i
62
63    x.set_value(3.0)
64    check_values(ceed, x, 3.0)
65    del x
66
67    x = ceed.Vector(n)
68    # Set value before setting or getting the array
69    x.set_value(5.0)
70    check_values(ceed, x, 5.0)
71
72# -------------------------------------------------------------------------------
73# Test getArrayRead state counter
74# -------------------------------------------------------------------------------
75
76
77def test_102(ceed_resource):
78    ceed = libceed.Ceed(ceed_resource)
79
80    n = 10
81    x = ceed.Vector(n)
82    x.set_value(0)
83
84    # Two read accesses should not generate an error
85    a = x.get_array_read()
86    b = x.get_array_read()
87
88    x.restore_array_read()
89    x.restore_array_read()
90
91# -------------------------------------------------------------------------------
92# Test setting one vector from array of another vector
93# -------------------------------------------------------------------------------
94
95
96def test_103(ceed_resource):
97    ceed = libceed.Ceed(ceed_resource)
98
99    n = 10
100
101    x = ceed.Vector(n)
102    y = ceed.Vector(n)
103
104    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
105    x.set_array(a, cmode=libceed.USE_POINTER)
106
107    with x.array() as x_array:
108        y.set_array(x_array, cmode=libceed.USE_POINTER)
109
110    with y.array_read() as y_array:
111        for i in range(n):
112            assert y_array[i] == 10 + i
113
114# -------------------------------------------------------------------------------
115# Test getArray to modify array
116# -------------------------------------------------------------------------------
117
118
119def test_104(ceed_resource):
120    ceed = libceed.Ceed(ceed_resource)
121
122    n = 10
123
124    x = ceed.Vector(n)
125    a = np.zeros(n, dtype=ceed.scalar_type())
126    x.set_array(a, cmode=libceed.USE_POINTER)
127
128    with x.array() as b:
129        b[3] = -3.14
130
131    if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32:
132        assert a[3] == np.float32(-3.14)
133    else:
134        assert a[3] == -3.14
135
136# -------------------------------------------------------------------------------
137# Test creation, setting, reading, restoring, and destroying of a vector using
138#   CEED_MEM_DEVICE
139# -------------------------------------------------------------------------------
140
141
142def test_105(ceed_resource):
143    # Skip test for non-GPU backend
144    if 'gpu' in ceed_resource:
145        ceed = libceed.Ceed(ceed_resource)
146
147        n = 10
148        x = ceed.Vector(n)
149        y = ceed.Vector(n)
150
151        a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
152        x.set_array(a, cmode=libceed.USE_POINTER)
153
154        arr = x.get_array_read(memtype=libceed.MEM_DEVICE)
155        y.set_array(arr, memtype=libceed.MEM_DEVICE)
156        x.restore_array_read()
157
158        with y.array_read() as b:
159            for i in range(n):
160                assert b[i] == 10 + i
161
162# -------------------------------------------------------------------------------
163# Test view
164# -------------------------------------------------------------------------------
165
166
167def test_107(ceed_resource, capsys):
168    ceed = libceed.Ceed(ceed_resource)
169
170    n = 10
171    x = ceed.Vector(n)
172
173    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
174    x.set_array(a, cmode=libceed.USE_POINTER)
175
176    print(x)
177
178    stdout, stderr, ref_stdout = check.output(capsys)
179    assert not stderr
180    assert stdout == ref_stdout
181
182# -------------------------------------------------------------------------------
183# Test norms
184# -------------------------------------------------------------------------------
185
186
187def test_108(ceed_resource, capsys):
188    ceed = libceed.Ceed(ceed_resource)
189
190    n = 10
191    x = ceed.Vector(n)
192
193    a = np.arange(0, n, dtype=ceed.scalar_type())
194    for i in range(n):
195        if (i % 2 == 0):
196            a[i] *= -1
197    x.set_array(a, cmode=libceed.USE_POINTER)
198
199    norm = x.norm(normtype=libceed.NORM_1)
200
201    assert abs(norm - 45.) < TOL
202
203    norm = x.norm()
204
205    assert abs(norm - np.sqrt(285.)) < TOL
206
207    norm = x.norm(normtype=libceed.NORM_MAX)
208
209    assert abs(norm - 9.) < TOL
210
211# -------------------------------------------------------------------------------
212# Test taking the reciprocal of a vector
213# -------------------------------------------------------------------------------
214
215
216def test_119(ceed_resource):
217    ceed = libceed.Ceed(ceed_resource)
218
219    n = 10
220    x = ceed.Vector(n)
221
222    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
223    x.set_array(a, cmode=libceed.USE_POINTER)
224    x.reciprocal()
225
226    with x.array_read() as b:
227        for i in range(n):
228            assert abs(b[i] - 1. / (10 + i)) < TOL
229
230# -------------------------------------------------------------------------------
231# Test AXPY
232# -------------------------------------------------------------------------------
233
234
235def test_121(ceed_resource, capsys):
236    ceed = libceed.Ceed(ceed_resource)
237
238    n = 10
239    x = ceed.Vector(n)
240    y = ceed.Vector(n)
241
242    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
243    x.set_array(a, cmode=libceed.COPY_VALUES)
244    y.set_array(a, cmode=libceed.COPY_VALUES)
245
246    y.axpy(-0.5, x)
247    with y.array() as b:
248        assert np.allclose(.5 * a, b)
249
250# -------------------------------------------------------------------------------
251# Test pointwise multiplication
252# -------------------------------------------------------------------------------
253
254
255def test_122(ceed_resource, capsys):
256    ceed = libceed.Ceed(ceed_resource)
257
258    n = 10
259    w = ceed.Vector(n)
260    x = ceed.Vector(n)
261    y = ceed.Vector(n)
262
263    a = np.arange(0, n, dtype=ceed.scalar_type())
264    w.set_array(a, cmode=libceed.COPY_VALUES)
265    x.set_array(a, cmode=libceed.COPY_VALUES)
266    y.set_array(a, cmode=libceed.COPY_VALUES)
267
268    w.pointwise_mult(x, y)
269    with w.array() as b:
270        for i in range(len(b)):
271            assert abs(b[i] - i * i) < 1e-14
272
273    w.pointwise_mult(w, y)
274    with w.array() as b:
275        for i in range(len(b)):
276            assert abs(b[i] - i * i * i) < 1e-14
277
278    w.pointwise_mult(x, w)
279    with w.array() as b:
280        for i in range(len(b)):
281            assert abs(b[i] - i * i * i * i) < 1e-14
282
283    y.pointwise_mult(y, y)
284    with y.array() as b:
285        for i in range(len(b)):
286            assert abs(b[i] - i * i) < 1e-14
287
288# -------------------------------------------------------------------------------
289# Test Scale
290# -------------------------------------------------------------------------------
291
292
293def test_123(ceed_resource, capsys):
294    ceed = libceed.Ceed(ceed_resource)
295
296    n = 10
297    x = ceed.Vector(n)
298
299    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
300    x.set_array(a, cmode=libceed.COPY_VALUES)
301
302    x.scale(-0.5)
303    with x.array() as b:
304        assert np.allclose(-.5 * a, b)
305
306# -------------------------------------------------------------------------------
307# Test getArrayWrite to modify array
308# -------------------------------------------------------------------------------
309
310
311def test_124(ceed_resource):
312    ceed = libceed.Ceed(ceed_resource)
313
314    n = 10
315
316    x = ceed.Vector(n)
317
318    with x.array_write() as a:
319        for i in range(len(a)):
320            a[i] = 3 * i
321
322    with x.array_read() as a:
323        for i in range(len(a)):
324            assert a[i] == 3 * i
325
326# -------------------------------------------------------------------------------
327# Test AXPBY
328# -------------------------------------------------------------------------------
329
330
331def test_125(ceed_resource, capsys):
332    ceed = libceed.Ceed(ceed_resource)
333
334    n = 10
335    x = ceed.Vector(n)
336    y = ceed.Vector(n)
337
338    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
339    x.set_array(a, cmode=libceed.COPY_VALUES)
340    y.set_array(a, cmode=libceed.COPY_VALUES)
341
342    y.axpby(-0.5, 1.0, x)
343    with y.array() as b:
344        assert np.allclose(0.5 * a, b)
345
346# -------------------------------------------------------------------------------
347# Test vector copy
348# -------------------------------------------------------------------------------
349
350
351def test_126(ceed_resource, capsys):
352    ceed = libceed.Ceed(ceed_resource)
353
354    n = 10
355
356    x = ceed.Vector(n)
357    y = ceed.Vector(n)
358
359    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
360    x.set_array(a, cmode=libceed.USE_POINTER)
361
362    a2 = np.arange(10, n, dtype=ceed.scalar_type())
363    y.set_array(a2, cmode=libceed.USE_POINTER)
364
365    y.copy_from(x)
366
367    with y.array_read() as y_array:
368        for i in range(n):
369            assert y_array[i] == a[i]
370
371
372# -------------------------------------------------------------------------------
373# Test modification of reshaped array
374# -------------------------------------------------------------------------------
375
376
377def test_199(ceed_resource):
378    """Modification of reshaped array"""
379    ceed = libceed.Ceed(ceed_resource)
380
381    vec = ceed.Vector(12)
382    vec.set_value(0.0)
383    with vec.array(4, 3) as x:
384        x[...] = np.eye(4, 3)
385
386    with vec.array_read(3, 4) as x:
387        assert np.all(x == np.eye(4, 3).reshape(3, 4))
388
389# -------------------------------------------------------------------------------
390