xref: /libCEED/python/tests/test-1-vector.py (revision 9c774eddf8c0b4f5416196d32c5355c9591a7190)
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
2580a9ef05SNatalie BeamsTOL = libceed.EPSILON * 256
2680a9ef05SNatalie 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
4880a9ef05SNatalie 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
6580a9ef05SNatalie 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)
91*9c774eddSJeremy L Thompson    x.set_value(0)
920ef72598Sjeremylt
930ef72598Sjeremylt    # Two read accesses should not generate an error
940ef72598Sjeremylt    a = x.get_array_read()
950ef72598Sjeremylt    b = x.get_array_read()
960ef72598Sjeremylt
970ef72598Sjeremylt    x.restore_array_read()
980ef72598Sjeremylt    x.restore_array_read()
990ef72598Sjeremylt
1000ef72598Sjeremylt# -------------------------------------------------------------------------------
1010ef72598Sjeremylt# Test setting one vector from array of another vector
1020ef72598Sjeremylt# -------------------------------------------------------------------------------
1030ef72598Sjeremylt
1040ef72598Sjeremylt
1050ef72598Sjeremyltdef test_103(ceed_resource):
1060ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1070ef72598Sjeremylt
1080ef72598Sjeremylt    n = 10
1090ef72598Sjeremylt
1100ef72598Sjeremylt    x = ceed.Vector(n)
1110ef72598Sjeremylt    y = ceed.Vector(n)
1120ef72598Sjeremylt
11380a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1140ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1150ef72598Sjeremylt
1160ef72598Sjeremylt    with x.array() as x_array:
1170ef72598Sjeremylt        y.set_array(x_array, cmode=libceed.USE_POINTER)
1180ef72598Sjeremylt
1190ef72598Sjeremylt    with y.array_read() as y_array:
1200ef72598Sjeremylt        for i in range(n):
1210ef72598Sjeremylt            assert y_array[i] == 10 + i
1220ef72598Sjeremylt
1230ef72598Sjeremylt# -------------------------------------------------------------------------------
1240ef72598Sjeremylt# Test getArray to modify array
1250ef72598Sjeremylt# -------------------------------------------------------------------------------
1260ef72598Sjeremylt
1270ef72598Sjeremylt
1280ef72598Sjeremyltdef test_104(ceed_resource):
1290ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1300ef72598Sjeremylt
1310ef72598Sjeremylt    n = 10
1320ef72598Sjeremylt
1330ef72598Sjeremylt    x = ceed.Vector(n)
13480a9ef05SNatalie Beams    a = np.zeros(n, dtype=ceed.scalar_type())
1350ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1360ef72598Sjeremylt
1370ef72598Sjeremylt    with x.array() as b:
1380ef72598Sjeremylt        b[3] = -3.14
1390ef72598Sjeremylt
14080a9ef05SNatalie Beams    if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32:
14180a9ef05SNatalie Beams        assert a[3] == np.float32(-3.14)
14280a9ef05SNatalie Beams    else:
1430ef72598Sjeremylt        assert a[3] == -3.14
1440ef72598Sjeremylt
1450ef72598Sjeremylt# -------------------------------------------------------------------------------
1460ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using
1470ef72598Sjeremylt#   CEED_MEM_DEVICE
1480ef72598Sjeremylt# -------------------------------------------------------------------------------
1490ef72598Sjeremylt
1500ef72598Sjeremylt
1510ef72598Sjeremyltdef test_105(ceed_resource):
1520ef72598Sjeremylt    # Skip test for non-GPU backend
1530ef72598Sjeremylt    if 'gpu' in ceed_resource:
1540ef72598Sjeremylt        ceed = libceed.Ceed(ceed_resource)
1550ef72598Sjeremylt
1560ef72598Sjeremylt        n = 10
1570ef72598Sjeremylt        x = ceed.Vector(n)
1580ef72598Sjeremylt        y = ceed.Vector(n)
1590ef72598Sjeremylt
16080a9ef05SNatalie Beams        a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1610ef72598Sjeremylt        x.set_array(a, cmode=libceed.USE_POINTER)
1620ef72598Sjeremylt
1630ef72598Sjeremylt        arr = x.get_array_read(memtype=libceed.MEM_DEVICE)
1640ef72598Sjeremylt        y.set_array(arr, memtype=libceed.MEM_DEVICE)
1650ef72598Sjeremylt        x.restore_array_read()
1660ef72598Sjeremylt
1670ef72598Sjeremylt        with y.array_read() as b:
1680ef72598Sjeremylt            for i in range(n):
1690ef72598Sjeremylt                assert b[i] == 10 + i
1700ef72598Sjeremylt
1710ef72598Sjeremylt# -------------------------------------------------------------------------------
1720ef72598Sjeremylt# Test view
1730ef72598Sjeremylt# -------------------------------------------------------------------------------
1740ef72598Sjeremylt
1750ef72598Sjeremylt
1760ef72598Sjeremyltdef test_107(ceed_resource, capsys):
1770ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1780ef72598Sjeremylt
1790ef72598Sjeremylt    n = 10
1800ef72598Sjeremylt    x = ceed.Vector(n)
1810ef72598Sjeremylt
18280a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
1830ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
1840ef72598Sjeremylt
1850ef72598Sjeremylt    print(x)
1860ef72598Sjeremylt
1870ef72598Sjeremylt    stdout, stderr, ref_stdout = check.output(capsys)
1880ef72598Sjeremylt    assert not stderr
1890ef72598Sjeremylt    assert stdout == ref_stdout
1900ef72598Sjeremylt
1910ef72598Sjeremylt# -------------------------------------------------------------------------------
1920ef72598Sjeremylt# Test norms
1930ef72598Sjeremylt# -------------------------------------------------------------------------------
1940ef72598Sjeremylt
1950ef72598Sjeremylt
1960ef72598Sjeremyltdef test_108(ceed_resource, capsys):
1970ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
1980ef72598Sjeremylt
1990ef72598Sjeremylt    n = 10
2000ef72598Sjeremylt    x = ceed.Vector(n)
2010ef72598Sjeremylt
20280a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
2030ef72598Sjeremylt    for i in range(n):
2040ef72598Sjeremylt        if (i % 2 == 0):
2050ef72598Sjeremylt            a[i] *= -1
2060ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
2070ef72598Sjeremylt
2080ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_1)
2090ef72598Sjeremylt
21080a9ef05SNatalie Beams    assert abs(norm - 45.) < TOL
2110ef72598Sjeremylt
2120ef72598Sjeremylt    norm = x.norm()
2130ef72598Sjeremylt
21480a9ef05SNatalie Beams    assert abs(norm - np.sqrt(285.)) < TOL
2150ef72598Sjeremylt
2160ef72598Sjeremylt    norm = x.norm(normtype=libceed.NORM_MAX)
2170ef72598Sjeremylt
21880a9ef05SNatalie Beams    assert abs(norm - 9.) < TOL
2190ef72598Sjeremylt
2200ef72598Sjeremylt# -------------------------------------------------------------------------------
2210ef72598Sjeremylt# Test taking the reciprocal of a vector
2220ef72598Sjeremylt# -------------------------------------------------------------------------------
2230ef72598Sjeremylt
2240ef72598Sjeremylt
2250ef72598Sjeremyltdef test_119(ceed_resource):
2260ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2270ef72598Sjeremylt
2280ef72598Sjeremylt    n = 10
2290ef72598Sjeremylt    x = ceed.Vector(n)
2300ef72598Sjeremylt
23180a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2320ef72598Sjeremylt    x.set_array(a, cmode=libceed.USE_POINTER)
2330ef72598Sjeremylt    x.reciprocal()
2340ef72598Sjeremylt
2350ef72598Sjeremylt    with x.array_read() as b:
2360ef72598Sjeremylt        for i in range(n):
23780a9ef05SNatalie Beams            assert abs(b[i] - 1. / (10 + i)) < TOL
2380ef72598Sjeremylt
2390ef72598Sjeremylt# -------------------------------------------------------------------------------
2400c1bc3c2Sjeremylt# Test AXPY
2410c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2420c1bc3c2Sjeremylt
2430c1bc3c2Sjeremylt
2440c1bc3c2Sjeremyltdef test_121(ceed_resource, capsys):
2450c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2460c1bc3c2Sjeremylt
2470c1bc3c2Sjeremylt    n = 10
2480c1bc3c2Sjeremylt    x = ceed.Vector(n)
2490c1bc3c2Sjeremylt    y = ceed.Vector(n)
2500c1bc3c2Sjeremylt
25180a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
2520c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2530c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2540c1bc3c2Sjeremylt
2550c1bc3c2Sjeremylt    y.axpy(-0.5, x)
2560c1bc3c2Sjeremylt    with y.array() as b:
257126de23bSjeremylt        assert np.allclose(.5 * a, b)
2580c1bc3c2Sjeremylt
2590c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2600c1bc3c2Sjeremylt# Test pointwise multiplication
2610c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
2620c1bc3c2Sjeremylt
2630c1bc3c2Sjeremylt
2640c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys):
2650c1bc3c2Sjeremylt    ceed = libceed.Ceed(ceed_resource)
2660c1bc3c2Sjeremylt
2670c1bc3c2Sjeremylt    n = 10
2680c1bc3c2Sjeremylt    w = ceed.Vector(n)
2690c1bc3c2Sjeremylt    x = ceed.Vector(n)
2700c1bc3c2Sjeremylt    y = ceed.Vector(n)
2710c1bc3c2Sjeremylt
27280a9ef05SNatalie Beams    a = np.arange(0, n, dtype=ceed.scalar_type())
2730c1bc3c2Sjeremylt    w.set_array(a, cmode=libceed.COPY_VALUES)
2740c1bc3c2Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
2750c1bc3c2Sjeremylt    y.set_array(a, cmode=libceed.COPY_VALUES)
2760c1bc3c2Sjeremylt
2770c1bc3c2Sjeremylt    w.pointwise_mult(x, y)
2780c1bc3c2Sjeremylt    with w.array() as b:
2790c1bc3c2Sjeremylt        for i in range(len(b)):
2800c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2810c1bc3c2Sjeremylt
2820c1bc3c2Sjeremylt    w.pointwise_mult(w, y)
2830c1bc3c2Sjeremylt    with w.array() as b:
2840c1bc3c2Sjeremylt        for i in range(len(b)):
2850c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i) < 1e-14
2860c1bc3c2Sjeremylt
2870c1bc3c2Sjeremylt    w.pointwise_mult(x, w)
2880c1bc3c2Sjeremylt    with w.array() as b:
2890c1bc3c2Sjeremylt        for i in range(len(b)):
2900c1bc3c2Sjeremylt            assert abs(b[i] - i * i * i * i) < 1e-14
2910c1bc3c2Sjeremylt
2920c1bc3c2Sjeremylt    y.pointwise_mult(y, y)
2930c1bc3c2Sjeremylt    with y.array() as b:
2940c1bc3c2Sjeremylt        for i in range(len(b)):
2950c1bc3c2Sjeremylt            assert abs(b[i] - i * i) < 1e-14
2960c1bc3c2Sjeremylt
2970c1bc3c2Sjeremylt# -------------------------------------------------------------------------------
298e0dd3b27Sjeremylt# Test Scale
299e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
300e0dd3b27Sjeremylt
301e0dd3b27Sjeremylt
302e0dd3b27Sjeremyltdef test_123(ceed_resource, capsys):
303e0dd3b27Sjeremylt    ceed = libceed.Ceed(ceed_resource)
304e0dd3b27Sjeremylt
305e0dd3b27Sjeremylt    n = 10
306e0dd3b27Sjeremylt    x = ceed.Vector(n)
307e0dd3b27Sjeremylt
30880a9ef05SNatalie Beams    a = np.arange(10, 10 + n, dtype=ceed.scalar_type())
309e0dd3b27Sjeremylt    x.set_array(a, cmode=libceed.COPY_VALUES)
310e0dd3b27Sjeremylt
311e0dd3b27Sjeremylt    x.scale(-0.5)
312e0dd3b27Sjeremylt    with x.array() as b:
313126de23bSjeremylt        assert np.allclose(-.5 * a, b)
314e0dd3b27Sjeremylt
315e0dd3b27Sjeremylt# -------------------------------------------------------------------------------
316*9c774eddSJeremy L Thompson# Test getArrayWrite to modify array
317*9c774eddSJeremy L Thompson# -------------------------------------------------------------------------------
318*9c774eddSJeremy L Thompson
319*9c774eddSJeremy L Thompson
320*9c774eddSJeremy L Thompsondef test_124(ceed_resource):
321*9c774eddSJeremy L Thompson    ceed = libceed.Ceed(ceed_resource)
322*9c774eddSJeremy L Thompson
323*9c774eddSJeremy L Thompson    n = 10
324*9c774eddSJeremy L Thompson
325*9c774eddSJeremy L Thompson    x = ceed.Vector(n)
326*9c774eddSJeremy L Thompson
327*9c774eddSJeremy L Thompson    with x.array_write() as a:
328*9c774eddSJeremy L Thompson        for i in range(len(a)):
329*9c774eddSJeremy L Thompson            a[i] = 3 * i
330*9c774eddSJeremy L Thompson
331*9c774eddSJeremy L Thompson    with x.array_read() as a:
332*9c774eddSJeremy L Thompson        for i in range(len(a)):
333*9c774eddSJeremy L Thompson            assert a[i] == 3 * i
334*9c774eddSJeremy L Thompson
335*9c774eddSJeremy L Thompson# -------------------------------------------------------------------------------
3360ef72598Sjeremylt# Test modification of reshaped array
3370ef72598Sjeremylt# -------------------------------------------------------------------------------
3380ef72598Sjeremylt
3390ef72598Sjeremylt
3400ef72598Sjeremyltdef test_199(ceed_resource):
3410ef72598Sjeremylt    """Modification of reshaped array"""
3420ef72598Sjeremylt    ceed = libceed.Ceed(ceed_resource)
3430ef72598Sjeremylt
3440ef72598Sjeremylt    vec = ceed.Vector(12)
345*9c774eddSJeremy L Thompson    vec.set_value(0.0)
3460ef72598Sjeremylt    with vec.array(4, 3) as x:
3470ef72598Sjeremylt        x[...] = np.eye(4, 3)
3480ef72598Sjeremylt
3490ef72598Sjeremylt    with vec.array_read(3, 4) as x:
3500ef72598Sjeremylt        assert np.all(x == np.eye(4, 3).reshape(3, 4))
3510ef72598Sjeremylt
3520ef72598Sjeremylt# -------------------------------------------------------------------------------
353