1*0ef72598Sjeremylt# Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at 2*0ef72598Sjeremylt# the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights 3*0ef72598Sjeremylt# reserved. See files LICENSE and NOTICE for details. 4*0ef72598Sjeremylt# 5*0ef72598Sjeremylt# This file is part of CEED, a collection of benchmarks, miniapps, software 6*0ef72598Sjeremylt# libraries and APIs for efficient high-order finite element and spectral 7*0ef72598Sjeremylt# element discretizations for exascale applications. For more information and 8*0ef72598Sjeremylt# source code availability see http://github.com/ceed. 9*0ef72598Sjeremylt# 10*0ef72598Sjeremylt# The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 11*0ef72598Sjeremylt# a collaborative effort of two U.S. Department of Energy organizations (Office 12*0ef72598Sjeremylt# of Science and the National Nuclear Security Administration) responsible for 13*0ef72598Sjeremylt# the planning and preparation of a capable exascale ecosystem, including 14*0ef72598Sjeremylt# software, applications, hardware, advanced system engineering and early 15*0ef72598Sjeremylt# testbed platforms, in support of the nation's exascale computing imperative. 16*0ef72598Sjeremylt 17*0ef72598Sjeremylt# @file 18*0ef72598Sjeremylt# Test Ceed Vector functionality 19*0ef72598Sjeremylt 20*0ef72598Sjeremyltimport os 21*0ef72598Sjeremyltimport libceed 22*0ef72598Sjeremyltimport numpy as np 23*0ef72598Sjeremyltimport check 24*0ef72598Sjeremylt 25*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 26*0ef72598Sjeremylt# Utility 27*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 28*0ef72598Sjeremylt 29*0ef72598Sjeremylt 30*0ef72598Sjeremyltdef check_values(ceed, x, value): 31*0ef72598Sjeremylt with x.array_read() as b: 32*0ef72598Sjeremylt for i in range(len(b)): 33*0ef72598Sjeremylt assert b[i] == value 34*0ef72598Sjeremylt 35*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 36*0ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector 37*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 38*0ef72598Sjeremylt 39*0ef72598Sjeremylt 40*0ef72598Sjeremyltdef test_100(ceed_resource): 41*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 42*0ef72598Sjeremylt 43*0ef72598Sjeremylt n = 10 44*0ef72598Sjeremylt x = ceed.Vector(n) 45*0ef72598Sjeremylt 46*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 47*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 48*0ef72598Sjeremylt 49*0ef72598Sjeremylt with x.array_read() as b: 50*0ef72598Sjeremylt for i in range(n): 51*0ef72598Sjeremylt assert b[i] == 10 + i 52*0ef72598Sjeremylt 53*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 54*0ef72598Sjeremylt# Test setValue 55*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 56*0ef72598Sjeremylt 57*0ef72598Sjeremylt 58*0ef72598Sjeremyltdef test_101(ceed_resource): 59*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 60*0ef72598Sjeremylt n = 10 61*0ef72598Sjeremylt x = ceed.Vector(n) 62*0ef72598Sjeremylt value = 1 63*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 64*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 65*0ef72598Sjeremylt 66*0ef72598Sjeremylt with x.array() as b: 67*0ef72598Sjeremylt for i in range(len(b)): 68*0ef72598Sjeremylt assert b[i] == 10 + i 69*0ef72598Sjeremylt 70*0ef72598Sjeremylt x.set_value(3.0) 71*0ef72598Sjeremylt check_values(ceed, x, 3.0) 72*0ef72598Sjeremylt del x 73*0ef72598Sjeremylt 74*0ef72598Sjeremylt x = ceed.Vector(n) 75*0ef72598Sjeremylt # Set value before setting or getting the array 76*0ef72598Sjeremylt x.set_value(5.0) 77*0ef72598Sjeremylt check_values(ceed, x, 5.0) 78*0ef72598Sjeremylt 79*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 80*0ef72598Sjeremylt# Test getArrayRead state counter 81*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 82*0ef72598Sjeremylt 83*0ef72598Sjeremylt 84*0ef72598Sjeremyltdef test_102(ceed_resource): 85*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 86*0ef72598Sjeremylt 87*0ef72598Sjeremylt n = 10 88*0ef72598Sjeremylt x = ceed.Vector(n) 89*0ef72598Sjeremylt 90*0ef72598Sjeremylt # Two read accesses should not generate an error 91*0ef72598Sjeremylt a = x.get_array_read() 92*0ef72598Sjeremylt b = x.get_array_read() 93*0ef72598Sjeremylt 94*0ef72598Sjeremylt x.restore_array_read() 95*0ef72598Sjeremylt x.restore_array_read() 96*0ef72598Sjeremylt 97*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 98*0ef72598Sjeremylt# Test setting one vector from array of another vector 99*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 100*0ef72598Sjeremylt 101*0ef72598Sjeremylt 102*0ef72598Sjeremyltdef test_103(ceed_resource): 103*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 104*0ef72598Sjeremylt 105*0ef72598Sjeremylt n = 10 106*0ef72598Sjeremylt 107*0ef72598Sjeremylt x = ceed.Vector(n) 108*0ef72598Sjeremylt y = ceed.Vector(n) 109*0ef72598Sjeremylt 110*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 111*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 112*0ef72598Sjeremylt 113*0ef72598Sjeremylt with x.array() as x_array: 114*0ef72598Sjeremylt y.set_array(x_array, cmode=libceed.USE_POINTER) 115*0ef72598Sjeremylt 116*0ef72598Sjeremylt with y.array_read() as y_array: 117*0ef72598Sjeremylt for i in range(n): 118*0ef72598Sjeremylt assert y_array[i] == 10 + i 119*0ef72598Sjeremylt 120*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 121*0ef72598Sjeremylt# Test getArray to modify array 122*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 123*0ef72598Sjeremylt 124*0ef72598Sjeremylt 125*0ef72598Sjeremyltdef test_104(ceed_resource): 126*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 127*0ef72598Sjeremylt 128*0ef72598Sjeremylt n = 10 129*0ef72598Sjeremylt 130*0ef72598Sjeremylt x = ceed.Vector(n) 131*0ef72598Sjeremylt a = np.zeros(n, dtype="float64") 132*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 133*0ef72598Sjeremylt 134*0ef72598Sjeremylt with x.array() as b: 135*0ef72598Sjeremylt b[3] = -3.14 136*0ef72598Sjeremylt 137*0ef72598Sjeremylt assert a[3] == -3.14 138*0ef72598Sjeremylt 139*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 140*0ef72598Sjeremylt# Test creation, setting, reading, restoring, and destroying of a vector using 141*0ef72598Sjeremylt# CEED_MEM_DEVICE 142*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 143*0ef72598Sjeremylt 144*0ef72598Sjeremylt 145*0ef72598Sjeremyltdef test_105(ceed_resource): 146*0ef72598Sjeremylt # Skip test for non-GPU backend 147*0ef72598Sjeremylt if 'gpu' in ceed_resource: 148*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 149*0ef72598Sjeremylt 150*0ef72598Sjeremylt n = 10 151*0ef72598Sjeremylt x = ceed.Vector(n) 152*0ef72598Sjeremylt y = ceed.Vector(n) 153*0ef72598Sjeremylt 154*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 155*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 156*0ef72598Sjeremylt 157*0ef72598Sjeremylt arr = x.get_array_read(memtype=libceed.MEM_DEVICE) 158*0ef72598Sjeremylt y.set_array(arr, memtype=libceed.MEM_DEVICE) 159*0ef72598Sjeremylt x.restore_array_read() 160*0ef72598Sjeremylt 161*0ef72598Sjeremylt with y.array_read() as b: 162*0ef72598Sjeremylt for i in range(n): 163*0ef72598Sjeremylt assert b[i] == 10 + i 164*0ef72598Sjeremylt 165*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 166*0ef72598Sjeremylt# Test view 167*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 168*0ef72598Sjeremylt 169*0ef72598Sjeremylt 170*0ef72598Sjeremyltdef test_107(ceed_resource, capsys): 171*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 172*0ef72598Sjeremylt 173*0ef72598Sjeremylt n = 10 174*0ef72598Sjeremylt x = ceed.Vector(n) 175*0ef72598Sjeremylt 176*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 177*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 178*0ef72598Sjeremylt 179*0ef72598Sjeremylt print(x) 180*0ef72598Sjeremylt 181*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 182*0ef72598Sjeremylt assert not stderr 183*0ef72598Sjeremylt assert stdout == ref_stdout 184*0ef72598Sjeremylt 185*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 186*0ef72598Sjeremylt# Test norms 187*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 188*0ef72598Sjeremylt 189*0ef72598Sjeremylt 190*0ef72598Sjeremyltdef test_108(ceed_resource, capsys): 191*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 192*0ef72598Sjeremylt 193*0ef72598Sjeremylt n = 10 194*0ef72598Sjeremylt x = ceed.Vector(n) 195*0ef72598Sjeremylt 196*0ef72598Sjeremylt a = np.arange(0, n, dtype="float64") 197*0ef72598Sjeremylt for i in range(n): 198*0ef72598Sjeremylt if (i % 2 == 0): 199*0ef72598Sjeremylt a[i] *= -1 200*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 201*0ef72598Sjeremylt 202*0ef72598Sjeremylt norm = x.norm(normtype=libceed.NORM_1) 203*0ef72598Sjeremylt 204*0ef72598Sjeremylt assert abs(norm - 45.) < 1e-14 205*0ef72598Sjeremylt 206*0ef72598Sjeremylt norm = x.norm() 207*0ef72598Sjeremylt 208*0ef72598Sjeremylt assert abs(norm - np.sqrt(285.)) < 1e-14 209*0ef72598Sjeremylt 210*0ef72598Sjeremylt norm = x.norm(normtype=libceed.NORM_MAX) 211*0ef72598Sjeremylt 212*0ef72598Sjeremylt assert abs(norm - 9.) < 1e-14 213*0ef72598Sjeremylt 214*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 215*0ef72598Sjeremylt# Test taking the reciprocal of a vector 216*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 217*0ef72598Sjeremylt 218*0ef72598Sjeremylt 219*0ef72598Sjeremyltdef test_119(ceed_resource): 220*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 221*0ef72598Sjeremylt 222*0ef72598Sjeremylt n = 10 223*0ef72598Sjeremylt x = ceed.Vector(n) 224*0ef72598Sjeremylt 225*0ef72598Sjeremylt a = np.arange(10, 10 + n, dtype="float64") 226*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 227*0ef72598Sjeremylt x.reciprocal() 228*0ef72598Sjeremylt 229*0ef72598Sjeremylt with x.array_read() as b: 230*0ef72598Sjeremylt for i in range(n): 231*0ef72598Sjeremylt assert abs(b[i] - 1. / (10 + i)) < 1e-15 232*0ef72598Sjeremylt 233*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 234*0ef72598Sjeremylt# Test modification of reshaped array 235*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 236*0ef72598Sjeremylt 237*0ef72598Sjeremylt 238*0ef72598Sjeremyltdef test_199(ceed_resource): 239*0ef72598Sjeremylt """Modification of reshaped array""" 240*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 241*0ef72598Sjeremylt 242*0ef72598Sjeremylt vec = ceed.Vector(12) 243*0ef72598Sjeremylt with vec.array(4, 3) as x: 244*0ef72598Sjeremylt x[...] = np.eye(4, 3) 245*0ef72598Sjeremylt 246*0ef72598Sjeremylt with vec.array_read(3, 4) as x: 247*0ef72598Sjeremylt assert np.all(x == np.eye(4, 3).reshape(3, 4)) 248*0ef72598Sjeremylt 249*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 250