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