1# Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors 2# All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3# 4# SPDX-License-Identifier: BSD-2-Clause 5# 6# This file is part of CEED: http://github.com/ceed 7 8# @file 9# Test Ceed Vector functionality 10 11import os 12import libceed 13import numpy as np 14import check 15 16TOL = libceed.EPSILON * 256 17 18# ------------------------------------------------------------------------------- 19# Utility 20# ------------------------------------------------------------------------------- 21 22 23def check_values(ceed, x, value): 24 with x.array_read() as b: 25 for i in range(len(b)): 26 assert b[i] == value 27 28# ------------------------------------------------------------------------------- 29# Test creation, setting, reading, restoring, and destroying of a vector 30# ------------------------------------------------------------------------------- 31 32 33def test_100(ceed_resource): 34 ceed = libceed.Ceed(ceed_resource) 35 36 n = 10 37 x = ceed.Vector(n) 38 39 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 40 x.set_array(a, cmode=libceed.USE_POINTER) 41 42 with x.array_read() as b: 43 for i in range(n): 44 assert b[i] == 10 + i 45 46# ------------------------------------------------------------------------------- 47# Test setValue 48# ------------------------------------------------------------------------------- 49 50 51def test_101(ceed_resource): 52 ceed = libceed.Ceed(ceed_resource) 53 n = 10 54 x = ceed.Vector(n) 55 value = 1 56 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 57 x.set_array(a, cmode=libceed.USE_POINTER) 58 59 with x.array() as b: 60 for i in range(len(b)): 61 assert b[i] == 10 + i 62 63 x.set_value(3.0) 64 check_values(ceed, x, 3.0) 65 del x 66 67 x = ceed.Vector(n) 68 # Set value before setting or getting the array 69 x.set_value(5.0) 70 check_values(ceed, x, 5.0) 71 72# ------------------------------------------------------------------------------- 73# Test getArrayRead state counter 74# ------------------------------------------------------------------------------- 75 76 77def test_102(ceed_resource): 78 ceed = libceed.Ceed(ceed_resource) 79 80 n = 10 81 x = ceed.Vector(n) 82 x.set_value(0) 83 84 # Two read accesses should not generate an error 85 a = x.get_array_read() 86 b = x.get_array_read() 87 88 x.restore_array_read() 89 x.restore_array_read() 90 91# ------------------------------------------------------------------------------- 92# Test setting one vector from array of another vector 93# ------------------------------------------------------------------------------- 94 95 96def test_103(ceed_resource): 97 ceed = libceed.Ceed(ceed_resource) 98 99 n = 10 100 101 x = ceed.Vector(n) 102 y = ceed.Vector(n) 103 104 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 105 x.set_array(a, cmode=libceed.USE_POINTER) 106 107 with x.array() as x_array: 108 y.set_array(x_array, cmode=libceed.USE_POINTER) 109 110 with y.array_read() as y_array: 111 for i in range(n): 112 assert y_array[i] == 10 + i 113 114# ------------------------------------------------------------------------------- 115# Test getArray to modify array 116# ------------------------------------------------------------------------------- 117 118 119def test_104(ceed_resource): 120 ceed = libceed.Ceed(ceed_resource) 121 122 n = 10 123 124 x = ceed.Vector(n) 125 a = np.zeros(n, dtype=ceed.scalar_type()) 126 x.set_array(a, cmode=libceed.USE_POINTER) 127 128 with x.array() as b: 129 b[3] = -3.14 130 131 if libceed.lib.CEED_SCALAR_TYPE == libceed.SCALAR_FP32: 132 assert a[3] == np.float32(-3.14) 133 else: 134 assert a[3] == -3.14 135 136# ------------------------------------------------------------------------------- 137# Test creation, setting, reading, restoring, and destroying of a vector using 138# CEED_MEM_DEVICE 139# ------------------------------------------------------------------------------- 140 141 142def test_105(ceed_resource): 143 # Skip test for non-GPU backend 144 if 'gpu' in ceed_resource: 145 ceed = libceed.Ceed(ceed_resource) 146 147 n = 10 148 x = ceed.Vector(n) 149 y = ceed.Vector(n) 150 151 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 152 x.set_array(a, cmode=libceed.USE_POINTER) 153 154 arr = x.get_array_read(memtype=libceed.MEM_DEVICE) 155 y.set_array(arr, memtype=libceed.MEM_DEVICE) 156 x.restore_array_read() 157 158 with y.array_read() as b: 159 for i in range(n): 160 assert b[i] == 10 + i 161 162# ------------------------------------------------------------------------------- 163# Test view 164# ------------------------------------------------------------------------------- 165 166 167def test_107(ceed_resource, capsys): 168 ceed = libceed.Ceed(ceed_resource) 169 170 n = 10 171 x = ceed.Vector(n) 172 173 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 174 x.set_array(a, cmode=libceed.USE_POINTER) 175 176 print(x) 177 178 stdout, stderr, ref_stdout = check.output(capsys) 179 assert not stderr 180 assert stdout == ref_stdout 181 182# ------------------------------------------------------------------------------- 183# Test norms 184# ------------------------------------------------------------------------------- 185 186 187def test_108(ceed_resource, capsys): 188 ceed = libceed.Ceed(ceed_resource) 189 190 n = 10 191 x = ceed.Vector(n) 192 193 a = np.arange(0, n, dtype=ceed.scalar_type()) 194 for i in range(n): 195 if (i % 2 == 0): 196 a[i] *= -1 197 x.set_array(a, cmode=libceed.USE_POINTER) 198 199 norm = x.norm(normtype=libceed.NORM_1) 200 201 assert abs(norm - 45.) < TOL 202 203 norm = x.norm() 204 205 assert abs(norm - np.sqrt(285.)) < TOL 206 207 norm = x.norm(normtype=libceed.NORM_MAX) 208 209 assert abs(norm - 9.) < TOL 210 211# ------------------------------------------------------------------------------- 212# Test taking the reciprocal of a vector 213# ------------------------------------------------------------------------------- 214 215 216def test_119(ceed_resource): 217 ceed = libceed.Ceed(ceed_resource) 218 219 n = 10 220 x = ceed.Vector(n) 221 222 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 223 x.set_array(a, cmode=libceed.USE_POINTER) 224 x.reciprocal() 225 226 with x.array_read() as b: 227 for i in range(n): 228 assert abs(b[i] - 1. / (10 + i)) < TOL 229 230# ------------------------------------------------------------------------------- 231# Test AXPY 232# ------------------------------------------------------------------------------- 233 234 235def test_121(ceed_resource, capsys): 236 ceed = libceed.Ceed(ceed_resource) 237 238 n = 10 239 x = ceed.Vector(n) 240 y = ceed.Vector(n) 241 242 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 243 x.set_array(a, cmode=libceed.COPY_VALUES) 244 y.set_array(a, cmode=libceed.COPY_VALUES) 245 246 y.axpy(-0.5, x) 247 with y.array() as b: 248 assert np.allclose(.5 * a, b) 249 250# ------------------------------------------------------------------------------- 251# Test pointwise multiplication 252# ------------------------------------------------------------------------------- 253 254 255def test_122(ceed_resource, capsys): 256 ceed = libceed.Ceed(ceed_resource) 257 258 n = 10 259 w = ceed.Vector(n) 260 x = ceed.Vector(n) 261 y = ceed.Vector(n) 262 263 a = np.arange(0, n, dtype=ceed.scalar_type()) 264 w.set_array(a, cmode=libceed.COPY_VALUES) 265 x.set_array(a, cmode=libceed.COPY_VALUES) 266 y.set_array(a, cmode=libceed.COPY_VALUES) 267 268 w.pointwise_mult(x, y) 269 with w.array() as b: 270 for i in range(len(b)): 271 assert abs(b[i] - i * i) < 1e-14 272 273 w.pointwise_mult(w, y) 274 with w.array() as b: 275 for i in range(len(b)): 276 assert abs(b[i] - i * i * i) < 1e-14 277 278 w.pointwise_mult(x, w) 279 with w.array() as b: 280 for i in range(len(b)): 281 assert abs(b[i] - i * i * i * i) < 1e-14 282 283 y.pointwise_mult(y, y) 284 with y.array() as b: 285 for i in range(len(b)): 286 assert abs(b[i] - i * i) < 1e-14 287 288# ------------------------------------------------------------------------------- 289# Test Scale 290# ------------------------------------------------------------------------------- 291 292 293def test_123(ceed_resource, capsys): 294 ceed = libceed.Ceed(ceed_resource) 295 296 n = 10 297 x = ceed.Vector(n) 298 299 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 300 x.set_array(a, cmode=libceed.COPY_VALUES) 301 302 x.scale(-0.5) 303 with x.array() as b: 304 assert np.allclose(-.5 * a, b) 305 306# ------------------------------------------------------------------------------- 307# Test getArrayWrite to modify array 308# ------------------------------------------------------------------------------- 309 310 311def test_124(ceed_resource): 312 ceed = libceed.Ceed(ceed_resource) 313 314 n = 10 315 316 x = ceed.Vector(n) 317 318 with x.array_write() as a: 319 for i in range(len(a)): 320 a[i] = 3 * i 321 322 with x.array_read() as a: 323 for i in range(len(a)): 324 assert a[i] == 3 * i 325 326# ------------------------------------------------------------------------------- 327# Test AXPBY 328# ------------------------------------------------------------------------------- 329 330 331def test_125(ceed_resource, capsys): 332 ceed = libceed.Ceed(ceed_resource) 333 334 n = 10 335 x = ceed.Vector(n) 336 y = ceed.Vector(n) 337 338 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 339 x.set_array(a, cmode=libceed.COPY_VALUES) 340 y.set_array(a, cmode=libceed.COPY_VALUES) 341 342 y.axpby(-0.5, 1.0, x) 343 with y.array() as b: 344 assert np.allclose(0.5 * a, b) 345 346# ------------------------------------------------------------------------------- 347# Test vector copy 348# ------------------------------------------------------------------------------- 349 350 351def test_126(ceed_resource, capsys): 352 ceed = libceed.Ceed(ceed_resource) 353 354 n = 10 355 356 x = ceed.Vector(n) 357 y = ceed.Vector(n) 358 359 a = np.arange(10, 10 + n, dtype=ceed.scalar_type()) 360 x.set_array(a, cmode=libceed.USE_POINTER) 361 362 a2 = np.arange(10, n, dtype=ceed.scalar_type()) 363 y.set_array(a2, cmode=libceed.USE_POINTER) 364 365 y.copy_from(x) 366 367 with y.array_read() as y_array: 368 for i in range(n): 369 assert y_array[i] == a[i] 370 371 372# ------------------------------------------------------------------------------- 373# Test modification of reshaped array 374# ------------------------------------------------------------------------------- 375 376 377def test_199(ceed_resource): 378 """Modification of reshaped array""" 379 ceed = libceed.Ceed(ceed_resource) 380 381 vec = ceed.Vector(12) 382 vec.set_value(0.0) 383 with vec.array(4, 3) as x: 384 x[...] = np.eye(4, 3) 385 386 with vec.array_read(3, 4) as x: 387 assert np.all(x == np.eye(4, 3).reshape(3, 4)) 388 389# ------------------------------------------------------------------------------- 390