1*5aed82e4SJeremy L Thompson# Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors 23d8e8822SJeremy L Thompson# All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 30ef72598Sjeremylt# 43d8e8822SJeremy L Thompson# SPDX-License-Identifier: BSD-2-Clause 50ef72598Sjeremylt# 63d8e8822SJeremy L Thompson# This file is part of CEED: http://github.com/ceed 70ef72598Sjeremylt 80ef72598Sjeremylt# @file 90ef72598Sjeremylt# Test Ceed Vector functionality 100ef72598Sjeremylt 110ef72598Sjeremyltimport os 120ef72598Sjeremyltimport libceed 130ef72598Sjeremyltimport numpy as np 140ef72598Sjeremyltimport check 150ef72598Sjeremylt 1680a9ef05SNatalie BeamsTOL = libceed.EPSILON * 256 1780a9ef05SNatalie Beams 180ef72598Sjeremylt# ------------------------------------------------------------------------------- 190ef72598Sjeremylt# Utility 200ef72598Sjeremylt# ------------------------------------------------------------------------------- 210ef72598Sjeremylt 220ef72598Sjeremylt 230ef72598Sjeremyltdef check_values(ceed, x, value): 240ef72598Sjeremylt with x.array_read() as b: 250ef72598Sjeremylt for i in range(len(b)): 260ef72598Sjeremylt assert b[i] == value 270ef72598Sjeremylt 280ef72598Sjeremylt# ------------------------------------------------------------------------------- 290ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector 300ef72598Sjeremylt# ------------------------------------------------------------------------------- 310ef72598Sjeremylt 320ef72598Sjeremylt 330ef72598Sjeremyltdef test_100(ceed_resource): 340ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 350ef72598Sjeremylt 360ef72598Sjeremylt n = 10 370ef72598Sjeremylt x = ceed.Vector(n) 380ef72598Sjeremylt 3980a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 400ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 410ef72598Sjeremylt 420ef72598Sjeremylt with x.array_read() as b: 430ef72598Sjeremylt for i in range(n): 440ef72598Sjeremylt assert b[i] == 10 + i 450ef72598Sjeremylt 460ef72598Sjeremylt# ------------------------------------------------------------------------------- 470ef72598Sjeremylt# Test setValue 480ef72598Sjeremylt# ------------------------------------------------------------------------------- 490ef72598Sjeremylt 500ef72598Sjeremylt 510ef72598Sjeremyltdef test_101(ceed_resource): 520ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 530ef72598Sjeremylt n = 10 540ef72598Sjeremylt x = ceed.Vector(n) 550ef72598Sjeremylt value = 1 5680a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 570ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 580ef72598Sjeremylt 590ef72598Sjeremylt with x.array() as b: 600ef72598Sjeremylt for i in range(len(b)): 610ef72598Sjeremylt assert b[i] == 10 + i 620ef72598Sjeremylt 630ef72598Sjeremylt x.set_value(3.0) 640ef72598Sjeremylt check_values(ceed, x, 3.0) 650ef72598Sjeremylt del x 660ef72598Sjeremylt 670ef72598Sjeremylt x = ceed.Vector(n) 680ef72598Sjeremylt # Set value before setting or getting the array 690ef72598Sjeremylt x.set_value(5.0) 700ef72598Sjeremylt check_values(ceed, x, 5.0) 710ef72598Sjeremylt 720ef72598Sjeremylt# ------------------------------------------------------------------------------- 730ef72598Sjeremylt# Test getArrayRead state counter 740ef72598Sjeremylt# ------------------------------------------------------------------------------- 750ef72598Sjeremylt 760ef72598Sjeremylt 770ef72598Sjeremyltdef test_102(ceed_resource): 780ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 790ef72598Sjeremylt 800ef72598Sjeremylt n = 10 810ef72598Sjeremylt x = ceed.Vector(n) 829c774eddSJeremy L Thompson x.set_value(0) 830ef72598Sjeremylt 840ef72598Sjeremylt # Two read accesses should not generate an error 850ef72598Sjeremylt a = x.get_array_read() 860ef72598Sjeremylt b = x.get_array_read() 870ef72598Sjeremylt 880ef72598Sjeremylt x.restore_array_read() 890ef72598Sjeremylt x.restore_array_read() 900ef72598Sjeremylt 910ef72598Sjeremylt# ------------------------------------------------------------------------------- 920ef72598Sjeremylt# Test setting one vector from array of another vector 930ef72598Sjeremylt# ------------------------------------------------------------------------------- 940ef72598Sjeremylt 950ef72598Sjeremylt 960ef72598Sjeremyltdef test_103(ceed_resource): 970ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 980ef72598Sjeremylt 990ef72598Sjeremylt n = 10 1000ef72598Sjeremylt 1010ef72598Sjeremylt x = ceed.Vector(n) 1020ef72598Sjeremylt y = ceed.Vector(n) 1030ef72598Sjeremylt 10480a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 1050ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 1060ef72598Sjeremylt 1070ef72598Sjeremylt with x.array() as x_array: 1080ef72598Sjeremylt y.set_array(x_array, cmode=libceed.USE_POINTER) 1090ef72598Sjeremylt 1100ef72598Sjeremylt with y.array_read() as y_array: 1110ef72598Sjeremylt for i in range(n): 1120ef72598Sjeremylt assert y_array[i] == 10 + i 1130ef72598Sjeremylt 1140ef72598Sjeremylt# ------------------------------------------------------------------------------- 1150ef72598Sjeremylt# Test getArray to modify array 1160ef72598Sjeremylt# ------------------------------------------------------------------------------- 1170ef72598Sjeremylt 1180ef72598Sjeremylt 1190ef72598Sjeremyltdef test_104(ceed_resource): 1200ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1210ef72598Sjeremylt 1220ef72598Sjeremylt n = 10 1230ef72598Sjeremylt 1240ef72598Sjeremylt x = ceed.Vector(n) 12580a9ef05SNatalie Beams a = np.zeros(n, dtype=ceed.scalar_type()) 1260ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 1270ef72598Sjeremylt 1280ef72598Sjeremylt with x.array() as b: 1290ef72598Sjeremylt b[3] = -3.14 1300ef72598Sjeremylt 13180a9ef05SNatalie Beams if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32: 13280a9ef05SNatalie Beams assert a[3] == np.float32(-3.14) 13380a9ef05SNatalie Beams else: 1340ef72598Sjeremylt assert a[3] == -3.14 1350ef72598Sjeremylt 1360ef72598Sjeremylt# ------------------------------------------------------------------------------- 1370ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using 1380ef72598Sjeremylt# CEED_MEM_DEVICE 1390ef72598Sjeremylt# ------------------------------------------------------------------------------- 1400ef72598Sjeremylt 1410ef72598Sjeremylt 1420ef72598Sjeremyltdef test_105(ceed_resource): 1430ef72598Sjeremylt # Skip test for non-GPU backend 1440ef72598Sjeremylt if 'gpu' in ceed_resource: 1450ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1460ef72598Sjeremylt 1470ef72598Sjeremylt n = 10 1480ef72598Sjeremylt x = ceed.Vector(n) 1490ef72598Sjeremylt y = ceed.Vector(n) 1500ef72598Sjeremylt 15180a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 1520ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 1530ef72598Sjeremylt 1540ef72598Sjeremylt arr = x.get_array_read(memtype=libceed.MEM_DEVICE) 1550ef72598Sjeremylt y.set_array(arr, memtype=libceed.MEM_DEVICE) 1560ef72598Sjeremylt x.restore_array_read() 1570ef72598Sjeremylt 1580ef72598Sjeremylt with y.array_read() as b: 1590ef72598Sjeremylt for i in range(n): 1600ef72598Sjeremylt assert b[i] == 10 + i 1610ef72598Sjeremylt 1620ef72598Sjeremylt# ------------------------------------------------------------------------------- 1630ef72598Sjeremylt# Test view 1640ef72598Sjeremylt# ------------------------------------------------------------------------------- 1650ef72598Sjeremylt 1660ef72598Sjeremylt 1670ef72598Sjeremyltdef test_107(ceed_resource, capsys): 1680ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1690ef72598Sjeremylt 1700ef72598Sjeremylt n = 10 1710ef72598Sjeremylt x = ceed.Vector(n) 1720ef72598Sjeremylt 17380a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 1740ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 1750ef72598Sjeremylt 1760ef72598Sjeremylt print(x) 1770ef72598Sjeremylt 1780ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 1790ef72598Sjeremylt assert not stderr 1800ef72598Sjeremylt assert stdout == ref_stdout 1810ef72598Sjeremylt 1820ef72598Sjeremylt# ------------------------------------------------------------------------------- 1830ef72598Sjeremylt# Test norms 1840ef72598Sjeremylt# ------------------------------------------------------------------------------- 1850ef72598Sjeremylt 1860ef72598Sjeremylt 1870ef72598Sjeremyltdef test_108(ceed_resource, capsys): 1880ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1890ef72598Sjeremylt 1900ef72598Sjeremylt n = 10 1910ef72598Sjeremylt x = ceed.Vector(n) 1920ef72598Sjeremylt 19380a9ef05SNatalie Beams a = np.arange(0, n, dtype=ceed.scalar_type()) 1940ef72598Sjeremylt for i in range(n): 1950ef72598Sjeremylt if (i % 2 == 0): 1960ef72598Sjeremylt a[i] *= -1 1970ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 1980ef72598Sjeremylt 1990ef72598Sjeremylt norm = x.norm(normtype=libceed.NORM_1) 2000ef72598Sjeremylt 20180a9ef05SNatalie Beams assert abs(norm - 45.) < TOL 2020ef72598Sjeremylt 2030ef72598Sjeremylt norm = x.norm() 2040ef72598Sjeremylt 20580a9ef05SNatalie Beams assert abs(norm - np.sqrt(285.)) < TOL 2060ef72598Sjeremylt 2070ef72598Sjeremylt norm = x.norm(normtype=libceed.NORM_MAX) 2080ef72598Sjeremylt 20980a9ef05SNatalie Beams assert abs(norm - 9.) < TOL 2100ef72598Sjeremylt 2110ef72598Sjeremylt# ------------------------------------------------------------------------------- 2120ef72598Sjeremylt# Test taking the reciprocal of a vector 2130ef72598Sjeremylt# ------------------------------------------------------------------------------- 2140ef72598Sjeremylt 2150ef72598Sjeremylt 2160ef72598Sjeremyltdef test_119(ceed_resource): 2170ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 2180ef72598Sjeremylt 2190ef72598Sjeremylt n = 10 2200ef72598Sjeremylt x = ceed.Vector(n) 2210ef72598Sjeremylt 22280a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 2230ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 2240ef72598Sjeremylt x.reciprocal() 2250ef72598Sjeremylt 2260ef72598Sjeremylt with x.array_read() as b: 2270ef72598Sjeremylt for i in range(n): 22880a9ef05SNatalie Beams assert abs(b[i] - 1. / (10 + i)) < TOL 2290ef72598Sjeremylt 2300ef72598Sjeremylt# ------------------------------------------------------------------------------- 2310c1bc3c2Sjeremylt# Test AXPY 2320c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 2330c1bc3c2Sjeremylt 2340c1bc3c2Sjeremylt 2350c1bc3c2Sjeremyltdef test_121(ceed_resource, capsys): 2360c1bc3c2Sjeremylt ceed = libceed.Ceed(ceed_resource) 2370c1bc3c2Sjeremylt 2380c1bc3c2Sjeremylt n = 10 2390c1bc3c2Sjeremylt x = ceed.Vector(n) 2400c1bc3c2Sjeremylt y = ceed.Vector(n) 2410c1bc3c2Sjeremylt 24280a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 2430c1bc3c2Sjeremylt x.set_array(a, cmode=libceed.COPY_VALUES) 2440c1bc3c2Sjeremylt y.set_array(a, cmode=libceed.COPY_VALUES) 2450c1bc3c2Sjeremylt 2460c1bc3c2Sjeremylt y.axpy(-0.5, x) 2470c1bc3c2Sjeremylt with y.array() as b: 248126de23bSjeremylt assert np.allclose(.5 * a, b) 2490c1bc3c2Sjeremylt 2500c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 2510c1bc3c2Sjeremylt# Test pointwise multiplication 2520c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 2530c1bc3c2Sjeremylt 2540c1bc3c2Sjeremylt 2550c1bc3c2Sjeremyltdef test_122(ceed_resource, capsys): 2560c1bc3c2Sjeremylt ceed = libceed.Ceed(ceed_resource) 2570c1bc3c2Sjeremylt 2580c1bc3c2Sjeremylt n = 10 2590c1bc3c2Sjeremylt w = ceed.Vector(n) 2600c1bc3c2Sjeremylt x = ceed.Vector(n) 2610c1bc3c2Sjeremylt y = ceed.Vector(n) 2620c1bc3c2Sjeremylt 26380a9ef05SNatalie Beams a = np.arange(0, n, dtype=ceed.scalar_type()) 2640c1bc3c2Sjeremylt w.set_array(a, cmode=libceed.COPY_VALUES) 2650c1bc3c2Sjeremylt x.set_array(a, cmode=libceed.COPY_VALUES) 2660c1bc3c2Sjeremylt y.set_array(a, cmode=libceed.COPY_VALUES) 2670c1bc3c2Sjeremylt 2680c1bc3c2Sjeremylt w.pointwise_mult(x, y) 2690c1bc3c2Sjeremylt with w.array() as b: 2700c1bc3c2Sjeremylt for i in range(len(b)): 2710c1bc3c2Sjeremylt assert abs(b[i] - i * i) < 1e-14 2720c1bc3c2Sjeremylt 2730c1bc3c2Sjeremylt w.pointwise_mult(w, y) 2740c1bc3c2Sjeremylt with w.array() as b: 2750c1bc3c2Sjeremylt for i in range(len(b)): 2760c1bc3c2Sjeremylt assert abs(b[i] - i * i * i) < 1e-14 2770c1bc3c2Sjeremylt 2780c1bc3c2Sjeremylt w.pointwise_mult(x, w) 2790c1bc3c2Sjeremylt with w.array() as b: 2800c1bc3c2Sjeremylt for i in range(len(b)): 2810c1bc3c2Sjeremylt assert abs(b[i] - i * i * i * i) < 1e-14 2820c1bc3c2Sjeremylt 2830c1bc3c2Sjeremylt y.pointwise_mult(y, y) 2840c1bc3c2Sjeremylt with y.array() as b: 2850c1bc3c2Sjeremylt for i in range(len(b)): 2860c1bc3c2Sjeremylt assert abs(b[i] - i * i) < 1e-14 2870c1bc3c2Sjeremylt 2880c1bc3c2Sjeremylt# ------------------------------------------------------------------------------- 289e0dd3b27Sjeremylt# Test Scale 290e0dd3b27Sjeremylt# ------------------------------------------------------------------------------- 291e0dd3b27Sjeremylt 292e0dd3b27Sjeremylt 293e0dd3b27Sjeremyltdef test_123(ceed_resource, capsys): 294e0dd3b27Sjeremylt ceed = libceed.Ceed(ceed_resource) 295e0dd3b27Sjeremylt 296e0dd3b27Sjeremylt n = 10 297e0dd3b27Sjeremylt x = ceed.Vector(n) 298e0dd3b27Sjeremylt 29980a9ef05SNatalie Beams a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 300e0dd3b27Sjeremylt x.set_array(a, cmode=libceed.COPY_VALUES) 301e0dd3b27Sjeremylt 302e0dd3b27Sjeremylt x.scale(-0.5) 303e0dd3b27Sjeremylt with x.array() as b: 304126de23bSjeremylt assert np.allclose(-.5 * a, b) 305e0dd3b27Sjeremylt 306e0dd3b27Sjeremylt# ------------------------------------------------------------------------------- 3079c774eddSJeremy L Thompson# Test getArrayWrite to modify array 3089c774eddSJeremy L Thompson# ------------------------------------------------------------------------------- 3099c774eddSJeremy L Thompson 3109c774eddSJeremy L Thompson 3119c774eddSJeremy L Thompsondef test_124(ceed_resource): 3129c774eddSJeremy L Thompson ceed = libceed.Ceed(ceed_resource) 3139c774eddSJeremy L Thompson 3149c774eddSJeremy L Thompson n = 10 3159c774eddSJeremy L Thompson 3169c774eddSJeremy L Thompson x = ceed.Vector(n) 3179c774eddSJeremy L Thompson 3189c774eddSJeremy L Thompson with x.array_write() as a: 3199c774eddSJeremy L Thompson for i in range(len(a)): 3209c774eddSJeremy L Thompson a[i] = 3 * i 3219c774eddSJeremy L Thompson 3229c774eddSJeremy L Thompson with x.array_read() as a: 3239c774eddSJeremy L Thompson for i in range(len(a)): 3249c774eddSJeremy L Thompson assert a[i] == 3 * i 3259c774eddSJeremy L Thompson 3269c774eddSJeremy L Thompson# ------------------------------------------------------------------------------- 3275fb68f37SKaren (Ren) Stengel# Test AXPBY 3285fb68f37SKaren (Ren) Stengel# ------------------------------------------------------------------------------- 3295fb68f37SKaren (Ren) Stengel 3305fb68f37SKaren (Ren) Stengel 3315fb68f37SKaren (Ren) Stengeldef test_125(ceed_resource, capsys): 3325fb68f37SKaren (Ren) Stengel ceed = libceed.Ceed(ceed_resource) 3335fb68f37SKaren (Ren) Stengel 3345fb68f37SKaren (Ren) Stengel n = 10 3355fb68f37SKaren (Ren) Stengel x = ceed.Vector(n) 3365fb68f37SKaren (Ren) Stengel y = ceed.Vector(n) 3375fb68f37SKaren (Ren) Stengel 3385fb68f37SKaren (Ren) Stengel a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 3395fb68f37SKaren (Ren) Stengel x.set_array(a, cmode=libceed.COPY_VALUES) 3405fb68f37SKaren (Ren) Stengel y.set_array(a, cmode=libceed.COPY_VALUES) 3415fb68f37SKaren (Ren) Stengel 3425fb68f37SKaren (Ren) Stengel y.axpby(-0.5, 1.0, x) 3435fb68f37SKaren (Ren) Stengel with y.array() as b: 344aa67b842SZach Atkins assert np.allclose(0.5 * a, b) 3455fb68f37SKaren (Ren) Stengel 3465fb68f37SKaren (Ren) Stengel# ------------------------------------------------------------------------------- 3475fb68f37SKaren (Ren) Stengel# Test vector copy 3485fb68f37SKaren (Ren) Stengel# ------------------------------------------------------------------------------- 3495fb68f37SKaren (Ren) Stengel 3505fb68f37SKaren (Ren) Stengel 3515fb68f37SKaren (Ren) Stengeldef test_126(ceed_resource, capsys): 3525fb68f37SKaren (Ren) Stengel ceed = libceed.Ceed(ceed_resource) 3535fb68f37SKaren (Ren) Stengel 3545fb68f37SKaren (Ren) Stengel n = 10 3555fb68f37SKaren (Ren) Stengel 3565fb68f37SKaren (Ren) Stengel x = ceed.Vector(n) 3575fb68f37SKaren (Ren) Stengel y = ceed.Vector(n) 3585fb68f37SKaren (Ren) Stengel 3595fb68f37SKaren (Ren) Stengel a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 3605fb68f37SKaren (Ren) Stengel x.set_array(a, cmode=libceed.USE_POINTER) 3615fb68f37SKaren (Ren) Stengel 3625fb68f37SKaren (Ren) Stengel a2 = np.arange(10, n, dtype=ceed.scalar_type()) 3635fb68f37SKaren (Ren) Stengel y.set_array(a2, cmode=libceed.USE_POINTER) 3645fb68f37SKaren (Ren) Stengel 3655fb68f37SKaren (Ren) Stengel y.copy_from(x) 3665fb68f37SKaren (Ren) Stengel 3675fb68f37SKaren (Ren) Stengel with y.array_read() as y_array: 3685fb68f37SKaren (Ren) Stengel for i in range(n): 3695fb68f37SKaren (Ren) Stengel assert y_array[i] == a[i] 3705fb68f37SKaren (Ren) Stengel 3715fb68f37SKaren (Ren) Stengel 3725fb68f37SKaren (Ren) Stengel# ------------------------------------------------------------------------------- 3730ef72598Sjeremylt# Test modification of reshaped array 3740ef72598Sjeremylt# ------------------------------------------------------------------------------- 3750ef72598Sjeremylt 3760ef72598Sjeremylt 3770ef72598Sjeremyltdef test_199(ceed_resource): 3780ef72598Sjeremylt """Modification of reshaped array""" 3790ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 3800ef72598Sjeremylt 3810ef72598Sjeremylt vec = ceed.Vector(12) 3829c774eddSJeremy L Thompson vec.set_value(0.0) 3830ef72598Sjeremylt with vec.array(4, 3) as x: 3840ef72598Sjeremylt x[...] = np.eye(4, 3) 3850ef72598Sjeremylt 3860ef72598Sjeremylt with vec.array_read(3, 4) as x: 3870ef72598Sjeremylt assert np.all(x == np.eye(4, 3).reshape(3, 4)) 3880ef72598Sjeremylt 3890ef72598Sjeremylt# ------------------------------------------------------------------------------- 390