xref: /libCEED/python/tests/test-1-vector.py (revision 0c1bc3c213b7e9c1cad4a62aaf359c4e4c7d4e25)
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# -------------------------------------------------------------------------------
234*0c1bc3c2Sjeremylt# Test AXPY
235*0c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
236*0c1bc3c2Sjeremylt
237*0c1bc3c2Sjeremylt
238*0c1bc3c2Sjeremyltdef test_121(ceed_resource, capsys):
239*0c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
240*0c1bc3c2Sjeremylt
241*0c1bc3c2Sjeremylt    n = 10
242*0c1bc3c2Sjeremylt    x = ceed.Vector(n)
243*0c1bc3c2Sjeremylt    y = ceed.Vector(n)
244*0c1bc3c2Sjeremylt
245*0c1bc3c2Sjeremylt    a = np.arange(10, 10 + n, dtype="float64")
246*0c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
247*0c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
248*0c1bc3c2Sjeremylt
249*0c1bc3c2Sjeremylt    y.axpy(-0.5, x)
250*0c1bc3c2Sjeremylt    with y.array() as b:
251*0c1bc3c2Sjeremylt        for i in range(len(b)):
252*0c1bc3c2Sjeremylt            assert abs(b[i] - (10 + i) / 2) < 1e-14
253*0c1bc3c2Sjeremylt
254*0c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
255*0c1bc3c2Sjeremylt# Test pointwise multiplication
256*0c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
257*0c1bc3c2Sjeremylt
258*0c1bc3c2Sjeremylt
259*0c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys):
260*0c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
261*0c1bc3c2Sjeremylt
262*0c1bc3c2Sjeremylt    n = 10
263*0c1bc3c2Sjeremylt    w = ceed.Vector(n)
264*0c1bc3c2Sjeremylt    x = ceed.Vector(n)
265*0c1bc3c2Sjeremylt    y = ceed.Vector(n)
266*0c1bc3c2Sjeremylt
267*0c1bc3c2Sjeremylt    a = np.arange(0, n, dtype="float64")
268*0c1bc3c2Sjeremylt    w.set_array(a, cmode=libceed.COPY_VALUES)
269*0c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
270*0c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
271*0c1bc3c2Sjeremylt
272*0c1bc3c2Sjeremylt    w.pointwise_mult(x, y)
273*0c1bc3c2Sjeremylt    with w.array() as b:
274*0c1bc3c2Sjeremylt        for i in range(len(b)):
275*0c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
276*0c1bc3c2Sjeremylt
277*0c1bc3c2Sjeremylt    w.pointwise_mult(w, y)
278*0c1bc3c2Sjeremylt    with w.array() as b:
279*0c1bc3c2Sjeremylt        for i in range(len(b)):
280*0c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i) < 1e-14
281*0c1bc3c2Sjeremylt
282*0c1bc3c2Sjeremylt    w.pointwise_mult(x, w)
283*0c1bc3c2Sjeremylt    with w.array() as b:
284*0c1bc3c2Sjeremylt        for i in range(len(b)):
285*0c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i * i) < 1e-14
286*0c1bc3c2Sjeremylt
287*0c1bc3c2Sjeremylt    y.pointwise_mult(y, y)
288*0c1bc3c2Sjeremylt    with y.array() as b:
289*0c1bc3c2Sjeremylt        for i in range(len(b)):
290*0c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
291*0c1bc3c2Sjeremylt
292*0c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2930ef72598Sjeremylt# Test modification of reshaped array
2940ef72598Sjeremylt# -------------------------------------------------------------------------------
2950ef72598Sjeremylt
2960ef72598Sjeremylt
2970ef72598Sjeremyltdef test_199(ceed_resource):
2980ef72598Sjeremylt    """Modification of reshaped array"""
2990ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
3000ef72598Sjeremylt
3010ef72598Sjeremylt    vec = ceed.Vector(12)
3020ef72598Sjeremylt    with vec.array(4, 3) as x:
3030ef72598Sjeremylt        x[...] = np.eye(4, 3)
3040ef72598Sjeremylt
3050ef72598Sjeremylt    with vec.array_read(3, 4) as x:
3060ef72598Sjeremylt        assert np.all(x == np.eye(4, 3).reshape(3, 4))
3070ef72598Sjeremylt
3080ef72598Sjeremylt# -------------------------------------------------------------------------------
309