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