xref: /libCEED/python/tests/test-1-vector.py (revision 80a9ef0545a39c00cdcaab1ca26f8053604f3120)
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 Vector functionality
190ef72598Sjeremylt
200ef72598Sjeremyltimport os
210ef72598Sjeremyltimport libceed
220ef72598Sjeremyltimport numpy as np
230ef72598Sjeremyltimport check
240ef72598Sjeremylt
25*80a9ef05SNatalie BeamsTOL = libceed.EPSILON * 256
26*80a9ef05SNatalie Beams
270ef72598Sjeremylt# -------------------------------------------------------------------------------
280ef72598Sjeremylt# Utility
290ef72598Sjeremylt# -------------------------------------------------------------------------------
300ef72598Sjeremylt
310ef72598Sjeremylt
320ef72598Sjeremyltdef check_values(ceed, x, value):
330ef72598Sjeremylt    with x.array_read() as b:
340ef72598Sjeremylt        for i in range(len(b)):
350ef72598Sjeremylt            assert b[i] == value
360ef72598Sjeremylt
370ef72598Sjeremylt# -------------------------------------------------------------------------------
380ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector
390ef72598Sjeremylt# -------------------------------------------------------------------------------
400ef72598Sjeremylt
410ef72598Sjeremylt
420ef72598Sjeremyltdef test_100(ceed_resource):
430ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
440ef72598Sjeremylt
450ef72598Sjeremylt    n = 10
460ef72598Sjeremylt    x = ceed.Vector(n)
470ef72598Sjeremylt
48*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
490ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
500ef72598Sjeremylt
510ef72598Sjeremylt    with x.array_read() as b:
520ef72598Sjeremylt        for i in range(n):
530ef72598Sjeremylt            assert b[i] == 10 + i
540ef72598Sjeremylt
550ef72598Sjeremylt# -------------------------------------------------------------------------------
560ef72598Sjeremylt# Test setValue
570ef72598Sjeremylt# -------------------------------------------------------------------------------
580ef72598Sjeremylt
590ef72598Sjeremylt
600ef72598Sjeremyltdef test_101(ceed_resource):
610ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
620ef72598Sjeremylt    n = 10
630ef72598Sjeremylt    x = ceed.Vector(n)
640ef72598Sjeremylt    value = 1
65*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
660ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
670ef72598Sjeremylt
680ef72598Sjeremylt    with x.array() as b:
690ef72598Sjeremylt        for i in range(len(b)):
700ef72598Sjeremylt            assert b[i] == 10 + i
710ef72598Sjeremylt
720ef72598Sjeremylt    x.set_value(3.0)
730ef72598Sjeremylt    check_values(ceed, x, 3.0)
740ef72598Sjeremylt    del x
750ef72598Sjeremylt
760ef72598Sjeremylt    x = ceed.Vector(n)
770ef72598Sjeremylt    # Set value before setting or getting the array
780ef72598Sjeremylt    x.set_value(5.0)
790ef72598Sjeremylt    check_values(ceed, x, 5.0)
800ef72598Sjeremylt
810ef72598Sjeremylt# -------------------------------------------------------------------------------
820ef72598Sjeremylt# Test getArrayRead state counter
830ef72598Sjeremylt# -------------------------------------------------------------------------------
840ef72598Sjeremylt
850ef72598Sjeremylt
860ef72598Sjeremyltdef test_102(ceed_resource):
870ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
880ef72598Sjeremylt
890ef72598Sjeremylt    n = 10
900ef72598Sjeremylt    x = ceed.Vector(n)
910ef72598Sjeremylt
920ef72598Sjeremylt    # Two read accesses should not generate an error
930ef72598Sjeremylt    a = x.get_array_read()
940ef72598Sjeremylt    b = x.get_array_read()
950ef72598Sjeremylt
960ef72598Sjeremylt    x.restore_array_read()
970ef72598Sjeremylt    x.restore_array_read()
980ef72598Sjeremylt
990ef72598Sjeremylt# -------------------------------------------------------------------------------
1000ef72598Sjeremylt# Test setting one vector from array of another vector
1010ef72598Sjeremylt# -------------------------------------------------------------------------------
1020ef72598Sjeremylt
1030ef72598Sjeremylt
1040ef72598Sjeremyltdef test_103(ceed_resource):
1050ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1060ef72598Sjeremylt
1070ef72598Sjeremylt    n = 10
1080ef72598Sjeremylt
1090ef72598Sjeremylt    x = ceed.Vector(n)
1100ef72598Sjeremylt    y = ceed.Vector(n)
1110ef72598Sjeremylt
112*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1130ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1140ef72598Sjeremylt
1150ef72598Sjeremylt    with x.array() as x_array:
1160ef72598Sjeremylt        y.set_array(x_array, cmode=libceed.USE_POINTER)
1170ef72598Sjeremylt
1180ef72598Sjeremylt    with y.array_read() as y_array:
1190ef72598Sjeremylt        for i in range(n):
1200ef72598Sjeremylt            assert y_array[i] == 10 + i
1210ef72598Sjeremylt
1220ef72598Sjeremylt# -------------------------------------------------------------------------------
1230ef72598Sjeremylt# Test getArray to modify array
1240ef72598Sjeremylt# -------------------------------------------------------------------------------
1250ef72598Sjeremylt
1260ef72598Sjeremylt
1270ef72598Sjeremyltdef test_104(ceed_resource):
1280ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1290ef72598Sjeremylt
1300ef72598Sjeremylt    n = 10
1310ef72598Sjeremylt
1320ef72598Sjeremylt    x = ceed.Vector(n)
133*80a9ef05SNatalie Beams    a = np.zeros(n, dtype=ceed.scalar_type())
1340ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1350ef72598Sjeremylt
1360ef72598Sjeremylt    with x.array() as b:
1370ef72598Sjeremylt        b[3] = -3.14
1380ef72598Sjeremylt
139*80a9ef05SNatalie Beams    if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32:
140*80a9ef05SNatalie Beams        assert a[3] == np.float32(-3.14)
141*80a9ef05SNatalie Beams    else:
1420ef72598Sjeremylt        assert a[3] == -3.14
1430ef72598Sjeremylt
1440ef72598Sjeremylt# -------------------------------------------------------------------------------
1450ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using
1460ef72598Sjeremylt#   CEED_MEM_DEVICE
1470ef72598Sjeremylt# -------------------------------------------------------------------------------
1480ef72598Sjeremylt
1490ef72598Sjeremylt
1500ef72598Sjeremyltdef test_105(ceed_resource):
1510ef72598Sjeremylt    # Skip test for non-GPU backend
1520ef72598Sjeremylt    if 'gpu' in ceed_resource:
1530ef72598Sjeremylt        ceed = libceed.Ceed(ceed_resource)
1540ef72598Sjeremylt
1550ef72598Sjeremylt        n = 10
1560ef72598Sjeremylt        x = ceed.Vector(n)
1570ef72598Sjeremylt        y = ceed.Vector(n)
1580ef72598Sjeremylt
159*80a9ef05SNatalie Beams        a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1600ef72598Sjeremylt        x.set_array(a, cmode=libceed.USE_POINTER)
1610ef72598Sjeremylt
1620ef72598Sjeremylt        arr = x.get_array_read(memtype=libceed.MEM_DEVICE)
1630ef72598Sjeremylt        y.set_array(arr, memtype=libceed.MEM_DEVICE)
1640ef72598Sjeremylt        x.restore_array_read()
1650ef72598Sjeremylt
1660ef72598Sjeremylt        with y.array_read() as b:
1670ef72598Sjeremylt            for i in range(n):
1680ef72598Sjeremylt                assert b[i] == 10 + i
1690ef72598Sjeremylt
1700ef72598Sjeremylt# -------------------------------------------------------------------------------
1710ef72598Sjeremylt# Test view
1720ef72598Sjeremylt# -------------------------------------------------------------------------------
1730ef72598Sjeremylt
1740ef72598Sjeremylt
1750ef72598Sjeremyltdef test_107(ceed_resource, capsys):
1760ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1770ef72598Sjeremylt
1780ef72598Sjeremylt    n = 10
1790ef72598Sjeremylt    x = ceed.Vector(n)
1800ef72598Sjeremylt
181*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1820ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1830ef72598Sjeremylt
1840ef72598Sjeremylt    print(x)
1850ef72598Sjeremylt
1860ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
1870ef72598Sjeremylt    assert not stderr
1880ef72598Sjeremylt    assert stdout == ref_stdout
1890ef72598Sjeremylt
1900ef72598Sjeremylt# -------------------------------------------------------------------------------
1910ef72598Sjeremylt# Test norms
1920ef72598Sjeremylt# -------------------------------------------------------------------------------
1930ef72598Sjeremylt
1940ef72598Sjeremylt
1950ef72598Sjeremyltdef test_108(ceed_resource, capsys):
1960ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1970ef72598Sjeremylt
1980ef72598Sjeremylt    n = 10
1990ef72598Sjeremylt    x = ceed.Vector(n)
2000ef72598Sjeremylt
201*80a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
2020ef72598Sjeremylt    for i in range(n):
2030ef72598Sjeremylt        if (i % 2 == 0):
2040ef72598Sjeremylt            a[i] *= -1
2050ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
2060ef72598Sjeremylt
2070ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_1)
2080ef72598Sjeremylt
209*80a9ef05SNatalie Beams    assert abs(norm - 45.) < TOL
2100ef72598Sjeremylt
2110ef72598Sjeremylt    norm = x.norm()
2120ef72598Sjeremylt
213*80a9ef05SNatalie Beams    assert abs(norm - np.sqrt(285.)) < TOL
2140ef72598Sjeremylt
2150ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_MAX)
2160ef72598Sjeremylt
217*80a9ef05SNatalie Beams    assert abs(norm - 9.) < TOL
2180ef72598Sjeremylt
2190ef72598Sjeremylt# -------------------------------------------------------------------------------
2200ef72598Sjeremylt# Test taking the reciprocal of a vector
2210ef72598Sjeremylt# -------------------------------------------------------------------------------
2220ef72598Sjeremylt
2230ef72598Sjeremylt
2240ef72598Sjeremyltdef test_119(ceed_resource):
2250ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2260ef72598Sjeremylt
2270ef72598Sjeremylt    n = 10
2280ef72598Sjeremylt    x = ceed.Vector(n)
2290ef72598Sjeremylt
230*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2310ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
2320ef72598Sjeremylt    x.reciprocal()
2330ef72598Sjeremylt
2340ef72598Sjeremylt    with x.array_read() as b:
2350ef72598Sjeremylt        for i in range(n):
236*80a9ef05SNatalie Beams            assert abs(b[i] - 1. / (10 + i)) < TOL
2370ef72598Sjeremylt
2380ef72598Sjeremylt# -------------------------------------------------------------------------------
2390c1bc3c2Sjeremylt# Test AXPY
2400c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2410c1bc3c2Sjeremylt
2420c1bc3c2Sjeremylt
2430c1bc3c2Sjeremyltdef test_121(ceed_resource, capsys):
2440c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2450c1bc3c2Sjeremylt
2460c1bc3c2Sjeremylt    n = 10
2470c1bc3c2Sjeremylt    x = ceed.Vector(n)
2480c1bc3c2Sjeremylt    y = ceed.Vector(n)
2490c1bc3c2Sjeremylt
250*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2510c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2520c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2530c1bc3c2Sjeremylt
2540c1bc3c2Sjeremylt    y.axpy(-0.5, x)
2550c1bc3c2Sjeremylt    with y.array() as b:
256126de23bSjeremylt        assert np.allclose(.5 * a, b)
2570c1bc3c2Sjeremylt
2580c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2590c1bc3c2Sjeremylt# Test pointwise multiplication
2600c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2610c1bc3c2Sjeremylt
2620c1bc3c2Sjeremylt
2630c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys):
2640c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2650c1bc3c2Sjeremylt
2660c1bc3c2Sjeremylt    n = 10
2670c1bc3c2Sjeremylt    w = ceed.Vector(n)
2680c1bc3c2Sjeremylt    x = ceed.Vector(n)
2690c1bc3c2Sjeremylt    y = ceed.Vector(n)
2700c1bc3c2Sjeremylt
271*80a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
2720c1bc3c2Sjeremylt    w.set_array(a, cmode=libceed.COPY_VALUES)
2730c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2740c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2750c1bc3c2Sjeremylt
2760c1bc3c2Sjeremylt    w.pointwise_mult(x, y)
2770c1bc3c2Sjeremylt    with w.array() as b:
2780c1bc3c2Sjeremylt        for i in range(len(b)):
2790c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2800c1bc3c2Sjeremylt
2810c1bc3c2Sjeremylt    w.pointwise_mult(w, y)
2820c1bc3c2Sjeremylt    with w.array() as b:
2830c1bc3c2Sjeremylt        for i in range(len(b)):
2840c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i) < 1e-14
2850c1bc3c2Sjeremylt
2860c1bc3c2Sjeremylt    w.pointwise_mult(x, w)
2870c1bc3c2Sjeremylt    with w.array() as b:
2880c1bc3c2Sjeremylt        for i in range(len(b)):
2890c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i * i) < 1e-14
2900c1bc3c2Sjeremylt
2910c1bc3c2Sjeremylt    y.pointwise_mult(y, y)
2920c1bc3c2Sjeremylt    with y.array() as b:
2930c1bc3c2Sjeremylt        for i in range(len(b)):
2940c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2950c1bc3c2Sjeremylt
2960c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
297e0dd3b27Sjeremylt# Test Scale
298e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
299e0dd3b27Sjeremylt
300e0dd3b27Sjeremylt
301e0dd3b27Sjeremyltdef test_123(ceed_resource, capsys):
302e0dd3b27Sjeremylt    ceed = libceed.Ceed(ceed_resource)
303e0dd3b27Sjeremylt
304e0dd3b27Sjeremylt    n = 10
305e0dd3b27Sjeremylt    x = ceed.Vector(n)
306e0dd3b27Sjeremylt
307*80a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
308e0dd3b27Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
309e0dd3b27Sjeremylt
310e0dd3b27Sjeremylt    x.scale(-0.5)
311e0dd3b27Sjeremylt    with x.array() as b:
312126de23bSjeremylt        assert np.allclose(-.5 * a, b)
313e0dd3b27Sjeremylt
314e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
3150ef72598Sjeremylt# Test modification of reshaped array
3160ef72598Sjeremylt# -------------------------------------------------------------------------------
3170ef72598Sjeremylt
3180ef72598Sjeremylt
3190ef72598Sjeremyltdef test_199(ceed_resource):
3200ef72598Sjeremylt    """Modification of reshaped array"""
3210ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
3220ef72598Sjeremylt
3230ef72598Sjeremylt    vec = ceed.Vector(12)
3240ef72598Sjeremylt    with vec.array(4, 3) as x:
3250ef72598Sjeremylt        x[...] = np.eye(4, 3)
3260ef72598Sjeremylt
3270ef72598Sjeremylt    with vec.array_read(3, 4) as x:
3280ef72598Sjeremylt        assert np.all(x == np.eye(4, 3).reshape(3, 4))
3290ef72598Sjeremylt
3300ef72598Sjeremylt# -------------------------------------------------------------------------------
331