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: 2510c1bc3c2Sjeremylt for i in range(len(b)): 2520c1bc3c2Sjeremylt assert abs(b[i] - (10 + i) / 2) < 1e-14 2530c1bc3c2Sjeremylt 2540c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 2550c1bc3c2Sjeremylt# Test pointwise multiplication 2560c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 2570c1bc3c2Sjeremylt 2580c1bc3c2Sjeremylt 2590c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys): 2600c1bc3c2Sjeremylt ceed = libceed.Ceed(ceed_resource) 2610c1bc3c2Sjeremylt 2620c1bc3c2Sjeremylt n = 10 2630c1bc3c2Sjeremylt w = ceed.Vector(n) 2640c1bc3c2Sjeremylt x = ceed.Vector(n) 2650c1bc3c2Sjeremylt y = ceed.Vector(n) 2660c1bc3c2Sjeremylt 2670c1bc3c2Sjeremylt a = np.arange(0, n, dtype="float64") 2680c1bc3c2Sjeremylt w.set_array(a, cmode=libceed.COPY_VALUES) 2690c1bc3c2Sjeremylt x.set_array(a, cmode=libceed.COPY_VALUES) 2700c1bc3c2Sjeremylt y.set_array(a, cmode=libceed.COPY_VALUES) 2710c1bc3c2Sjeremylt 2720c1bc3c2Sjeremylt w.pointwise_mult(x, y) 2730c1bc3c2Sjeremylt with w.array() as b: 2740c1bc3c2Sjeremylt for i in range(len(b)): 2750c1bc3c2Sjeremylt assert abs(b[i] - i * i) < 1e-14 2760c1bc3c2Sjeremylt 2770c1bc3c2Sjeremylt w.pointwise_mult(w, y) 2780c1bc3c2Sjeremylt with w.array() as b: 2790c1bc3c2Sjeremylt for i in range(len(b)): 2800c1bc3c2Sjeremylt assert abs(b[i] - i * i * i) < 1e-14 2810c1bc3c2Sjeremylt 2820c1bc3c2Sjeremylt w.pointwise_mult(x, w) 2830c1bc3c2Sjeremylt with w.array() as b: 2840c1bc3c2Sjeremylt for i in range(len(b)): 2850c1bc3c2Sjeremylt assert abs(b[i] - i * i * i * i) < 1e-14 2860c1bc3c2Sjeremylt 2870c1bc3c2Sjeremylt y.pointwise_mult(y, y) 2880c1bc3c2Sjeremylt with y.array() as b: 2890c1bc3c2Sjeremylt for i in range(len(b)): 2900c1bc3c2Sjeremylt assert abs(b[i] - i * i) < 1e-14 2910c1bc3c2Sjeremylt 2920c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 293*e0dd3b27Sjeremylt# Test Scale 294*e0dd3b27Sjeremylt# ------------------------------------------------------------------------------- 295*e0dd3b27Sjeremylt 296*e0dd3b27Sjeremylt 297*e0dd3b27Sjeremyltdef test_123(ceed_resource, capsys): 298*e0dd3b27Sjeremylt ceed = libceed.Ceed(ceed_resource) 299*e0dd3b27Sjeremylt 300*e0dd3b27Sjeremylt n = 10 301*e0dd3b27Sjeremylt x = ceed.Vector(n) 302*e0dd3b27Sjeremylt 303*e0dd3b27Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 304*e0dd3b27Sjeremylt x.set_array(a, cmode=libceed.COPY_VALUES) 305*e0dd3b27Sjeremylt 306*e0dd3b27Sjeremylt x.scale(-0.5) 307*e0dd3b27Sjeremylt with x.array() as b: 308*e0dd3b27Sjeremylt for i in range(len(b)): 309*e0dd3b27Sjeremylt assert abs(b[i] + (10 + i) / 2) < 1e-14 310*e0dd3b27Sjeremylt 311*e0dd3b27Sjeremylt# ------------------------------------------------------------------------------- 3120ef72598Sjeremylt# Test modification of reshaped array 3130ef72598Sjeremylt# ------------------------------------------------------------------------------- 3140ef72598Sjeremylt 3150ef72598Sjeremylt 3160ef72598Sjeremyltdef test_199(ceed_resource): 3170ef72598Sjeremylt """Modification of reshaped array""" 3180ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 3190ef72598Sjeremylt 3200ef72598Sjeremylt vec = ceed.Vector(12) 3210ef72598Sjeremylt with vec.array(4, 3) as x: 3220ef72598Sjeremylt x[...] = np.eye(4, 3) 3230ef72598Sjeremylt 3240ef72598Sjeremylt with vec.array_read(3, 4) as x: 3250ef72598Sjeremylt assert np.all(x == np.eye(4, 3).reshape(3, 4)) 3260ef72598Sjeremylt 3270ef72598Sjeremylt# ------------------------------------------------------------------------------- 328