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