xref: /libCEED/python/tests/test-1-vector.py (revision 3d8e882215d238700cdceb37404f76ca7fa24eaa)
1*3d8e8822SJeremy L Thompson# Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors
2*3d8e8822SJeremy L Thompson# All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
30ef72598Sjeremylt#
4*3d8e8822SJeremy L Thompson# SPDX-License-Identifier: BSD-2-Clause
50ef72598Sjeremylt#
6*3d8e8822SJeremy L Thompson# This file is part of CEED:  http://github.com/ceed
70ef72598Sjeremylt
80ef72598Sjeremylt# @file
90ef72598Sjeremylt# Test Ceed Vector functionality
100ef72598Sjeremylt
110ef72598Sjeremyltimport os
120ef72598Sjeremyltimport libceed
130ef72598Sjeremyltimport numpy as np
140ef72598Sjeremyltimport check
150ef72598Sjeremylt
1680a9ef05SNatalie BeamsTOL = libceed.EPSILON * 256
1780a9ef05SNatalie Beams
180ef72598Sjeremylt# -------------------------------------------------------------------------------
190ef72598Sjeremylt# Utility
200ef72598Sjeremylt# -------------------------------------------------------------------------------
210ef72598Sjeremylt
220ef72598Sjeremylt
230ef72598Sjeremyltdef check_values(ceed, x, value):
240ef72598Sjeremylt    with x.array_read() as b:
250ef72598Sjeremylt        for i in range(len(b)):
260ef72598Sjeremylt            assert b[i] == value
270ef72598Sjeremylt
280ef72598Sjeremylt# -------------------------------------------------------------------------------
290ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector
300ef72598Sjeremylt# -------------------------------------------------------------------------------
310ef72598Sjeremylt
320ef72598Sjeremylt
330ef72598Sjeremyltdef test_100(ceed_resource):
340ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
350ef72598Sjeremylt
360ef72598Sjeremylt    n = 10
370ef72598Sjeremylt    x = ceed.Vector(n)
380ef72598Sjeremylt
3980a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
400ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
410ef72598Sjeremylt
420ef72598Sjeremylt    with x.array_read() as b:
430ef72598Sjeremylt        for i in range(n):
440ef72598Sjeremylt            assert b[i] == 10 + i
450ef72598Sjeremylt
460ef72598Sjeremylt# -------------------------------------------------------------------------------
470ef72598Sjeremylt# Test setValue
480ef72598Sjeremylt# -------------------------------------------------------------------------------
490ef72598Sjeremylt
500ef72598Sjeremylt
510ef72598Sjeremyltdef test_101(ceed_resource):
520ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
530ef72598Sjeremylt    n = 10
540ef72598Sjeremylt    x = ceed.Vector(n)
550ef72598Sjeremylt    value = 1
5680a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
570ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
580ef72598Sjeremylt
590ef72598Sjeremylt    with x.array() as b:
600ef72598Sjeremylt        for i in range(len(b)):
610ef72598Sjeremylt            assert b[i] == 10 + i
620ef72598Sjeremylt
630ef72598Sjeremylt    x.set_value(3.0)
640ef72598Sjeremylt    check_values(ceed, x, 3.0)
650ef72598Sjeremylt    del x
660ef72598Sjeremylt
670ef72598Sjeremylt    x = ceed.Vector(n)
680ef72598Sjeremylt    # Set value before setting or getting the array
690ef72598Sjeremylt    x.set_value(5.0)
700ef72598Sjeremylt    check_values(ceed, x, 5.0)
710ef72598Sjeremylt
720ef72598Sjeremylt# -------------------------------------------------------------------------------
730ef72598Sjeremylt# Test getArrayRead state counter
740ef72598Sjeremylt# -------------------------------------------------------------------------------
750ef72598Sjeremylt
760ef72598Sjeremylt
770ef72598Sjeremyltdef test_102(ceed_resource):
780ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
790ef72598Sjeremylt
800ef72598Sjeremylt    n = 10
810ef72598Sjeremylt    x = ceed.Vector(n)
829c774eddSJeremy L Thompson    x.set_value(0)
830ef72598Sjeremylt
840ef72598Sjeremylt    # Two read accesses should not generate an error
850ef72598Sjeremylt    a = x.get_array_read()
860ef72598Sjeremylt    b = x.get_array_read()
870ef72598Sjeremylt
880ef72598Sjeremylt    x.restore_array_read()
890ef72598Sjeremylt    x.restore_array_read()
900ef72598Sjeremylt
910ef72598Sjeremylt# -------------------------------------------------------------------------------
920ef72598Sjeremylt# Test setting one vector from array of another vector
930ef72598Sjeremylt# -------------------------------------------------------------------------------
940ef72598Sjeremylt
950ef72598Sjeremylt
960ef72598Sjeremyltdef test_103(ceed_resource):
970ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
980ef72598Sjeremylt
990ef72598Sjeremylt    n = 10
1000ef72598Sjeremylt
1010ef72598Sjeremylt    x = ceed.Vector(n)
1020ef72598Sjeremylt    y = ceed.Vector(n)
1030ef72598Sjeremylt
10480a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1050ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1060ef72598Sjeremylt
1070ef72598Sjeremylt    with x.array() as x_array:
1080ef72598Sjeremylt        y.set_array(x_array, cmode=libceed.USE_POINTER)
1090ef72598Sjeremylt
1100ef72598Sjeremylt    with y.array_read() as y_array:
1110ef72598Sjeremylt        for i in range(n):
1120ef72598Sjeremylt            assert y_array[i] == 10 + i
1130ef72598Sjeremylt
1140ef72598Sjeremylt# -------------------------------------------------------------------------------
1150ef72598Sjeremylt# Test getArray to modify array
1160ef72598Sjeremylt# -------------------------------------------------------------------------------
1170ef72598Sjeremylt
1180ef72598Sjeremylt
1190ef72598Sjeremyltdef test_104(ceed_resource):
1200ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1210ef72598Sjeremylt
1220ef72598Sjeremylt    n = 10
1230ef72598Sjeremylt
1240ef72598Sjeremylt    x = ceed.Vector(n)
12580a9ef05SNatalie Beams    a = np.zeros(n, dtype=ceed.scalar_type())
1260ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1270ef72598Sjeremylt
1280ef72598Sjeremylt    with x.array() as b:
1290ef72598Sjeremylt        b[3] = -3.14
1300ef72598Sjeremylt
13180a9ef05SNatalie Beams    if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32:
13280a9ef05SNatalie Beams        assert a[3] == np.float32(-3.14)
13380a9ef05SNatalie Beams    else:
1340ef72598Sjeremylt        assert a[3] == -3.14
1350ef72598Sjeremylt
1360ef72598Sjeremylt# -------------------------------------------------------------------------------
1370ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using
1380ef72598Sjeremylt#   CEED_MEM_DEVICE
1390ef72598Sjeremylt# -------------------------------------------------------------------------------
1400ef72598Sjeremylt
1410ef72598Sjeremylt
1420ef72598Sjeremyltdef test_105(ceed_resource):
1430ef72598Sjeremylt    # Skip test for non-GPU backend
1440ef72598Sjeremylt    if 'gpu' in ceed_resource:
1450ef72598Sjeremylt        ceed = libceed.Ceed(ceed_resource)
1460ef72598Sjeremylt
1470ef72598Sjeremylt        n = 10
1480ef72598Sjeremylt        x = ceed.Vector(n)
1490ef72598Sjeremylt        y = ceed.Vector(n)
1500ef72598Sjeremylt
15180a9ef05SNatalie Beams        a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1520ef72598Sjeremylt        x.set_array(a, cmode=libceed.USE_POINTER)
1530ef72598Sjeremylt
1540ef72598Sjeremylt        arr = x.get_array_read(memtype=libceed.MEM_DEVICE)
1550ef72598Sjeremylt        y.set_array(arr, memtype=libceed.MEM_DEVICE)
1560ef72598Sjeremylt        x.restore_array_read()
1570ef72598Sjeremylt
1580ef72598Sjeremylt        with y.array_read() as b:
1590ef72598Sjeremylt            for i in range(n):
1600ef72598Sjeremylt                assert b[i] == 10 + i
1610ef72598Sjeremylt
1620ef72598Sjeremylt# -------------------------------------------------------------------------------
1630ef72598Sjeremylt# Test view
1640ef72598Sjeremylt# -------------------------------------------------------------------------------
1650ef72598Sjeremylt
1660ef72598Sjeremylt
1670ef72598Sjeremyltdef test_107(ceed_resource, capsys):
1680ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1690ef72598Sjeremylt
1700ef72598Sjeremylt    n = 10
1710ef72598Sjeremylt    x = ceed.Vector(n)
1720ef72598Sjeremylt
17380a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1740ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1750ef72598Sjeremylt
1760ef72598Sjeremylt    print(x)
1770ef72598Sjeremylt
1780ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
1790ef72598Sjeremylt    assert not stderr
1800ef72598Sjeremylt    assert stdout == ref_stdout
1810ef72598Sjeremylt
1820ef72598Sjeremylt# -------------------------------------------------------------------------------
1830ef72598Sjeremylt# Test norms
1840ef72598Sjeremylt# -------------------------------------------------------------------------------
1850ef72598Sjeremylt
1860ef72598Sjeremylt
1870ef72598Sjeremyltdef test_108(ceed_resource, capsys):
1880ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1890ef72598Sjeremylt
1900ef72598Sjeremylt    n = 10
1910ef72598Sjeremylt    x = ceed.Vector(n)
1920ef72598Sjeremylt
19380a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
1940ef72598Sjeremylt    for i in range(n):
1950ef72598Sjeremylt        if (i % 2 == 0):
1960ef72598Sjeremylt            a[i] *= -1
1970ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1980ef72598Sjeremylt
1990ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_1)
2000ef72598Sjeremylt
20180a9ef05SNatalie Beams    assert abs(norm - 45.) < TOL
2020ef72598Sjeremylt
2030ef72598Sjeremylt    norm = x.norm()
2040ef72598Sjeremylt
20580a9ef05SNatalie Beams    assert abs(norm - np.sqrt(285.)) < TOL
2060ef72598Sjeremylt
2070ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_MAX)
2080ef72598Sjeremylt
20980a9ef05SNatalie Beams    assert abs(norm - 9.) < TOL
2100ef72598Sjeremylt
2110ef72598Sjeremylt# -------------------------------------------------------------------------------
2120ef72598Sjeremylt# Test taking the reciprocal of a vector
2130ef72598Sjeremylt# -------------------------------------------------------------------------------
2140ef72598Sjeremylt
2150ef72598Sjeremylt
2160ef72598Sjeremyltdef test_119(ceed_resource):
2170ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2180ef72598Sjeremylt
2190ef72598Sjeremylt    n = 10
2200ef72598Sjeremylt    x = ceed.Vector(n)
2210ef72598Sjeremylt
22280a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2230ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
2240ef72598Sjeremylt    x.reciprocal()
2250ef72598Sjeremylt
2260ef72598Sjeremylt    with x.array_read() as b:
2270ef72598Sjeremylt        for i in range(n):
22880a9ef05SNatalie Beams            assert abs(b[i] - 1. / (10 + i)) < TOL
2290ef72598Sjeremylt
2300ef72598Sjeremylt# -------------------------------------------------------------------------------
2310c1bc3c2Sjeremylt# Test AXPY
2320c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2330c1bc3c2Sjeremylt
2340c1bc3c2Sjeremylt
2350c1bc3c2Sjeremyltdef test_121(ceed_resource, capsys):
2360c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2370c1bc3c2Sjeremylt
2380c1bc3c2Sjeremylt    n = 10
2390c1bc3c2Sjeremylt    x = ceed.Vector(n)
2400c1bc3c2Sjeremylt    y = ceed.Vector(n)
2410c1bc3c2Sjeremylt
24280a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2430c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2440c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2450c1bc3c2Sjeremylt
2460c1bc3c2Sjeremylt    y.axpy(-0.5, x)
2470c1bc3c2Sjeremylt    with y.array() as b:
248126de23bSjeremylt        assert np.allclose(.5 * a, b)
2490c1bc3c2Sjeremylt
2500c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2510c1bc3c2Sjeremylt# Test pointwise multiplication
2520c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2530c1bc3c2Sjeremylt
2540c1bc3c2Sjeremylt
2550c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys):
2560c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2570c1bc3c2Sjeremylt
2580c1bc3c2Sjeremylt    n = 10
2590c1bc3c2Sjeremylt    w = ceed.Vector(n)
2600c1bc3c2Sjeremylt    x = ceed.Vector(n)
2610c1bc3c2Sjeremylt    y = ceed.Vector(n)
2620c1bc3c2Sjeremylt
26380a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
2640c1bc3c2Sjeremylt    w.set_array(a, cmode=libceed.COPY_VALUES)
2650c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2660c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2670c1bc3c2Sjeremylt
2680c1bc3c2Sjeremylt    w.pointwise_mult(x, y)
2690c1bc3c2Sjeremylt    with w.array() as b:
2700c1bc3c2Sjeremylt        for i in range(len(b)):
2710c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2720c1bc3c2Sjeremylt
2730c1bc3c2Sjeremylt    w.pointwise_mult(w, y)
2740c1bc3c2Sjeremylt    with w.array() as b:
2750c1bc3c2Sjeremylt        for i in range(len(b)):
2760c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i) < 1e-14
2770c1bc3c2Sjeremylt
2780c1bc3c2Sjeremylt    w.pointwise_mult(x, w)
2790c1bc3c2Sjeremylt    with w.array() as b:
2800c1bc3c2Sjeremylt        for i in range(len(b)):
2810c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i * i) < 1e-14
2820c1bc3c2Sjeremylt
2830c1bc3c2Sjeremylt    y.pointwise_mult(y, y)
2840c1bc3c2Sjeremylt    with y.array() as b:
2850c1bc3c2Sjeremylt        for i in range(len(b)):
2860c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2870c1bc3c2Sjeremylt
2880c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
289e0dd3b27Sjeremylt# Test Scale
290e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
291e0dd3b27Sjeremylt
292e0dd3b27Sjeremylt
293e0dd3b27Sjeremyltdef test_123(ceed_resource, capsys):
294e0dd3b27Sjeremylt    ceed = libceed.Ceed(ceed_resource)
295e0dd3b27Sjeremylt
296e0dd3b27Sjeremylt    n = 10
297e0dd3b27Sjeremylt    x = ceed.Vector(n)
298e0dd3b27Sjeremylt
29980a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
300e0dd3b27Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
301e0dd3b27Sjeremylt
302e0dd3b27Sjeremylt    x.scale(-0.5)
303e0dd3b27Sjeremylt    with x.array() as b:
304126de23bSjeremylt        assert np.allclose(-.5 * a, b)
305e0dd3b27Sjeremylt
306e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
3079c774eddSJeremy L Thompson# Test getArrayWrite to modify array
3089c774eddSJeremy L Thompson# -------------------------------------------------------------------------------
3099c774eddSJeremy L Thompson
3109c774eddSJeremy L Thompson
3119c774eddSJeremy L Thompsondef test_124(ceed_resource):
3129c774eddSJeremy L Thompson    ceed = libceed.Ceed(ceed_resource)
3139c774eddSJeremy L Thompson
3149c774eddSJeremy L Thompson    n = 10
3159c774eddSJeremy L Thompson
3169c774eddSJeremy L Thompson    x = ceed.Vector(n)
3179c774eddSJeremy L Thompson
3189c774eddSJeremy L Thompson    with x.array_write() as a:
3199c774eddSJeremy L Thompson        for i in range(len(a)):
3209c774eddSJeremy L Thompson            a[i] = 3 * i
3219c774eddSJeremy L Thompson
3229c774eddSJeremy L Thompson    with x.array_read() as a:
3239c774eddSJeremy L Thompson        for i in range(len(a)):
3249c774eddSJeremy L Thompson            assert a[i] == 3 * i
3259c774eddSJeremy L Thompson
3269c774eddSJeremy L Thompson# -------------------------------------------------------------------------------
3270ef72598Sjeremylt# Test modification of reshaped array
3280ef72598Sjeremylt# -------------------------------------------------------------------------------
3290ef72598Sjeremylt
3300ef72598Sjeremylt
3310ef72598Sjeremyltdef test_199(ceed_resource):
3320ef72598Sjeremylt    """Modification of reshaped array"""
3330ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
3340ef72598Sjeremylt
3350ef72598Sjeremylt    vec = ceed.Vector(12)
3369c774eddSJeremy L Thompson    vec.set_value(0.0)
3370ef72598Sjeremylt    with vec.array(4, 3) as x:
3380ef72598Sjeremylt        x[...] = np.eye(4, 3)
3390ef72598Sjeremylt
3400ef72598Sjeremylt    with vec.array_read(3, 4) as x:
3410ef72598Sjeremylt        assert np.all(x == np.eye(4, 3).reshape(3, 4))
3420ef72598Sjeremylt
3430ef72598Sjeremylt# -------------------------------------------------------------------------------
344