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 ElemRestriction functionality 190ef72598Sjeremylt 200ef72598Sjeremyltimport os 210ef72598Sjeremyltimport libceed 220ef72598Sjeremyltimport numpy as np 230ef72598Sjeremyltimport check 240ef72598Sjeremylt 250ef72598Sjeremylt# ------------------------------------------------------------------------------- 260ef72598Sjeremylt# Test creation, use, and destruction of an element restriction 270ef72598Sjeremylt# ------------------------------------------------------------------------------- 280ef72598Sjeremylt 290ef72598Sjeremylt 300ef72598Sjeremyltdef test_200(ceed_resource): 310ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 320ef72598Sjeremylt 33c3a5a609SJeremy L Thompson num_elem = 3 340ef72598Sjeremylt 35c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 36*80a9ef05SNatalie Beams a = np.arange(10, 10 + num_elem + 1, dtype=ceed.scalar_type()) 370ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 380ef72598Sjeremylt 39c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 40c3a5a609SJeremy L Thompson for i in range(num_elem): 410ef72598Sjeremylt ind[2 * i + 0] = i 420ef72598Sjeremylt ind[2 * i + 1] = i + 1 43c3a5a609SJeremy L Thompson r = ceed.ElemRestriction(num_elem, 2, 1, 1, num_elem + 1, ind, 440ef72598Sjeremylt cmode=libceed.USE_POINTER) 450ef72598Sjeremylt 46c3a5a609SJeremy L Thompson y = ceed.Vector(2 * num_elem) 470ef72598Sjeremylt y.set_value(0) 480ef72598Sjeremylt 490ef72598Sjeremylt r.apply(x, y) 500ef72598Sjeremylt 510ef72598Sjeremylt with y.array_read() as y_array: 52c3a5a609SJeremy L Thompson for i in range(2 * num_elem): 530ef72598Sjeremylt assert 10 + (i + 1) // 2 == y_array[i] 540ef72598Sjeremylt 550ef72598Sjeremylt# ------------------------------------------------------------------------------- 560ef72598Sjeremylt# Test creation, use, and destruction of a strided element restriction 570ef72598Sjeremylt# ------------------------------------------------------------------------------- 580ef72598Sjeremylt 590ef72598Sjeremylt 600ef72598Sjeremyltdef test_201(ceed_resource): 610ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 620ef72598Sjeremylt 63c3a5a609SJeremy L Thompson num_elem = 3 640ef72598Sjeremylt 65c3a5a609SJeremy L Thompson x = ceed.Vector(2 * num_elem) 66*80a9ef05SNatalie Beams a = np.arange(10, 10 + 2 * num_elem, dtype=ceed.scalar_type()) 670ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 680ef72598Sjeremylt 690ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 70c3a5a609SJeremy L Thompson r = ceed.StridedElemRestriction(num_elem, 2, 1, 2 * num_elem, strides) 710ef72598Sjeremylt 72c3a5a609SJeremy L Thompson y = ceed.Vector(2 * num_elem) 730ef72598Sjeremylt y.set_value(0) 740ef72598Sjeremylt 750ef72598Sjeremylt r.apply(x, y) 760ef72598Sjeremylt 770ef72598Sjeremylt with y.array_read() as y_array: 78c3a5a609SJeremy L Thompson for i in range(2 * num_elem): 790ef72598Sjeremylt assert 10 + i == y_array[i] 800ef72598Sjeremylt 810ef72598Sjeremylt# ------------------------------------------------------------------------------- 820ef72598Sjeremylt# Test creation and destruction of a blocked element restriction 830ef72598Sjeremylt# ------------------------------------------------------------------------------- 840ef72598Sjeremylt 850ef72598Sjeremylt 860ef72598Sjeremyltdef test_202(ceed_resource, capsys): 870ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 880ef72598Sjeremylt 89c3a5a609SJeremy L Thompson num_elem = 8 90c3a5a609SJeremy L Thompson elem_size = 2 91c3a5a609SJeremy L Thompson num_blk = 2 92c3a5a609SJeremy L Thompson blk_size = 5 930ef72598Sjeremylt 94c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 95*80a9ef05SNatalie Beams a = np.arange(10, 10 + num_elem + 1, dtype=ceed.scalar_type()) 96c3a5a609SJeremy L Thompson x.set_array(a, cmode=libceed.COPY_VALUES) 970ef72598Sjeremylt 98c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 99c3a5a609SJeremy L Thompson for i in range(num_elem): 1000ef72598Sjeremylt ind[2 * i + 0] = i 1010ef72598Sjeremylt ind[2 * i + 1] = i + 1 102c3a5a609SJeremy L Thompson r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1, 103c3a5a609SJeremy L Thompson num_elem + 1, ind, cmode=libceed.COPY_VALUES) 1040ef72598Sjeremylt 105c3a5a609SJeremy L Thompson y = ceed.Vector(num_blk * blk_size * elem_size) 1060ef72598Sjeremylt y.set_value(0) 1070ef72598Sjeremylt 108c3a5a609SJeremy L Thompson # NoTranspose 1090ef72598Sjeremylt r.apply(x, y) 110c3a5a609SJeremy L Thompson layout = r.get_layout() 111c3a5a609SJeremy L Thompson with y.array_read() as y_array: 112c3a5a609SJeremy L Thompson for i in range(elem_size): 113c3a5a609SJeremy L Thompson for j in range(1): 114c3a5a609SJeremy L Thompson for k in range(num_elem): 115c3a5a609SJeremy L Thompson block = int(k / blk_size) 116c3a5a609SJeremy L Thompson elem = k % blk_size 117c3a5a609SJeremy L Thompson indx = (i * blk_size + elem) * \ 118c3a5a609SJeremy L Thompson layout[0] + j * blk_size * layout[1] + \ 119c3a5a609SJeremy L Thompson block * blk_size * layout[2] 120c3a5a609SJeremy L Thompson assert y_array[indx] == a[ind[k * elem_size + i]] 1210ef72598Sjeremylt 1220ef72598Sjeremylt x.set_value(0) 1230ef72598Sjeremylt r.T.apply(y, x) 124c3a5a609SJeremy L Thompson with x.array_read() as x_array: 125c3a5a609SJeremy L Thompson for i in range(num_elem + 1): 126c3a5a609SJeremy L Thompson assert x_array[i] == (10 + i) * (2.0 if i > 127c3a5a609SJeremy L Thompson 0 and i < num_elem else 1.0) 1280ef72598Sjeremylt 1290ef72598Sjeremylt# ------------------------------------------------------------------------------- 1300ef72598Sjeremylt# Test creation, use, and destruction of a blocked element restriction 1310ef72598Sjeremylt# ------------------------------------------------------------------------------- 1320ef72598Sjeremylt 1330ef72598Sjeremylt 134c3a5a609SJeremy L Thompsondef test_208(ceed_resource): 1350ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1360ef72598Sjeremylt 137c3a5a609SJeremy L Thompson num_elem = 8 138c3a5a609SJeremy L Thompson elem_size = 2 139c3a5a609SJeremy L Thompson num_blk = 2 140c3a5a609SJeremy L Thompson blk_size = 5 1410ef72598Sjeremylt 142c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 143*80a9ef05SNatalie Beams a = np.arange(10, 10 + num_elem + 1, dtype=ceed.scalar_type()) 144c3a5a609SJeremy L Thompson x.set_array(a, cmode=libceed.COPY_VALUES) 1450ef72598Sjeremylt 146c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 147c3a5a609SJeremy L Thompson for i in range(num_elem): 1480ef72598Sjeremylt ind[2 * i + 0] = i 1490ef72598Sjeremylt ind[2 * i + 1] = i + 1 150c3a5a609SJeremy L Thompson r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1, 151c3a5a609SJeremy L Thompson num_elem + 1, ind, cmode=libceed.COPY_VALUES) 1520ef72598Sjeremylt 153c3a5a609SJeremy L Thompson y = ceed.Vector(blk_size * elem_size) 1540ef72598Sjeremylt y.set_value(0) 1550ef72598Sjeremylt 156c3a5a609SJeremy L Thompson # NoTranspose 1570ef72598Sjeremylt r.apply_block(1, x, y) 158c3a5a609SJeremy L Thompson layout = r.get_layout() 159c3a5a609SJeremy L Thompson with y.array_read() as y_array: 160c3a5a609SJeremy L Thompson for i in range(elem_size): 161c3a5a609SJeremy L Thompson for j in range(1): 162c3a5a609SJeremy L Thompson for k in range(blk_size, num_elem): 163c3a5a609SJeremy L Thompson block = int(k / blk_size) 164c3a5a609SJeremy L Thompson elem = k % blk_size 165c3a5a609SJeremy L Thompson indx = (i * blk_size + elem) * layout[0] + j * blk_size * \ 166c3a5a609SJeremy L Thompson layout[1] + block * blk_size * \ 167c3a5a609SJeremy L Thompson layout[2] - blk_size * elem_size 168c3a5a609SJeremy L Thompson assert y_array[indx] == a[ind[k * elem_size + i]] 1690ef72598Sjeremylt 1700ef72598Sjeremylt x.set_value(0) 1710ef72598Sjeremylt r.T.apply_block(1, y, x) 172c3a5a609SJeremy L Thompson with x.array_read() as x_array: 173c3a5a609SJeremy L Thompson for i in range(blk_size, num_elem + 1): 174c3a5a609SJeremy L Thompson assert x_array[i] == (10 + i) * (2.0 if i > 175c3a5a609SJeremy L Thompson blk_size and i < num_elem else 1.0) 1760ef72598Sjeremylt 1770ef72598Sjeremylt# ------------------------------------------------------------------------------- 1780ef72598Sjeremylt# Test getting the multiplicity of the indices in an element restriction 1790ef72598Sjeremylt# ------------------------------------------------------------------------------- 1800ef72598Sjeremylt 1810ef72598Sjeremylt 1820ef72598Sjeremyltdef test_209(ceed_resource): 1830ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1840ef72598Sjeremylt 185c3a5a609SJeremy L Thompson num_elem = 3 1860ef72598Sjeremylt 187c3a5a609SJeremy L Thompson ind = np.zeros(4 * num_elem, dtype="int32") 188c3a5a609SJeremy L Thompson for i in range(num_elem): 1890ef72598Sjeremylt ind[4 * i + 0] = i * 3 + 0 1900ef72598Sjeremylt ind[4 * i + 1] = i * 3 + 1 1910ef72598Sjeremylt ind[4 * i + 2] = i * 3 + 2 1920ef72598Sjeremylt ind[4 * i + 3] = i * 3 + 3 193c3a5a609SJeremy L Thompson r = ceed.ElemRestriction(num_elem, 4, 1, 1, 3 * num_elem + 1, ind, 1940ef72598Sjeremylt cmode=libceed.USE_POINTER) 1950ef72598Sjeremylt 1960ef72598Sjeremylt mult = r.get_multiplicity() 1970ef72598Sjeremylt 1980ef72598Sjeremylt with mult.array_read() as mult_array: 199c3a5a609SJeremy L Thompson for i in range(3 * num_elem + 1): 200c3a5a609SJeremy L Thompson val = 1 + (1 if (i > 0 and i < 3 * num_elem and i % 3 == 0) else 0) 2010ef72598Sjeremylt assert val == mult_array[i] 2020ef72598Sjeremylt 2030ef72598Sjeremylt# ------------------------------------------------------------------------------- 2040ef72598Sjeremylt# Test creation and view of an element restriction 2050ef72598Sjeremylt# ------------------------------------------------------------------------------- 2060ef72598Sjeremylt 2070ef72598Sjeremylt 2080ef72598Sjeremyltdef test_210(ceed_resource, capsys): 2090ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 2100ef72598Sjeremylt 211c3a5a609SJeremy L Thompson num_elem = 3 2120ef72598Sjeremylt 213c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 214c3a5a609SJeremy L Thompson for i in range(num_elem): 2150ef72598Sjeremylt ind[2 * i + 0] = i + 0 2160ef72598Sjeremylt ind[2 * i + 1] = i + 1 217c3a5a609SJeremy L Thompson r = ceed.ElemRestriction(num_elem, 2, 1, 1, num_elem + 1, ind, 2180ef72598Sjeremylt cmode=libceed.USE_POINTER) 2190ef72598Sjeremylt 2200ef72598Sjeremylt print(r) 2210ef72598Sjeremylt 2220ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 2230ef72598Sjeremylt assert not stderr 2240ef72598Sjeremylt assert stdout == ref_stdout 2250ef72598Sjeremylt 2260ef72598Sjeremylt# ------------------------------------------------------------------------------- 2270ef72598Sjeremylt# Test creation and view of a strided element restriction 2280ef72598Sjeremylt# ------------------------------------------------------------------------------- 2290ef72598Sjeremylt 2300ef72598Sjeremylt 2310ef72598Sjeremyltdef test_211(ceed_resource, capsys): 2320ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 2330ef72598Sjeremylt 234c3a5a609SJeremy L Thompson num_elem = 3 2350ef72598Sjeremylt 2360ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 237c3a5a609SJeremy L Thompson r = ceed.StridedElemRestriction(num_elem, 2, 1, num_elem + 1, strides) 2380ef72598Sjeremylt 2390ef72598Sjeremylt print(r) 2400ef72598Sjeremylt 2410ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 2420ef72598Sjeremylt assert not stderr 2430ef72598Sjeremylt assert stdout == ref_stdout 2440ef72598Sjeremylt 2450ef72598Sjeremylt# ------------------------------------------------------------------------------- 2460ef72598Sjeremylt# Test creation and view of a blocked strided element restriction 2470ef72598Sjeremylt# ------------------------------------------------------------------------------- 2480ef72598Sjeremylt 2490ef72598Sjeremylt 2500ef72598Sjeremyltdef test_212(ceed_resource, capsys): 2510ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 2520ef72598Sjeremylt 253c3a5a609SJeremy L Thompson num_elem = 3 2540ef72598Sjeremylt 2550ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 256c3a5a609SJeremy L Thompson r = ceed.BlockedStridedElemRestriction( 257c3a5a609SJeremy L Thompson num_elem, 2, 2, 1, num_elem + 1, strides) 2580ef72598Sjeremylt 2590ef72598Sjeremylt print(r) 2600ef72598Sjeremylt 2610ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 2620ef72598Sjeremylt assert not stderr 2630ef72598Sjeremylt assert stdout == ref_stdout 2640ef72598Sjeremylt 2650ef72598Sjeremylt# ------------------------------------------------------------------------------- 266