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 33*c3a5a609SJeremy L Thompson num_elem = 3 340ef72598Sjeremylt 35*c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 36*c3a5a609SJeremy L Thompson a = np.arange(10, 10 + num_elem + 1, dtype="float64") 370ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 380ef72598Sjeremylt 39*c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 40*c3a5a609SJeremy L Thompson for i in range(num_elem): 410ef72598Sjeremylt ind[2 * i + 0] = i 420ef72598Sjeremylt ind[2 * i + 1] = i + 1 43*c3a5a609SJeremy L Thompson r = ceed.ElemRestriction(num_elem, 2, 1, 1, num_elem + 1, ind, 440ef72598Sjeremylt cmode=libceed.USE_POINTER) 450ef72598Sjeremylt 46*c3a5a609SJeremy 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: 52*c3a5a609SJeremy 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 63*c3a5a609SJeremy L Thompson num_elem = 3 640ef72598Sjeremylt 65*c3a5a609SJeremy L Thompson x = ceed.Vector(2 * num_elem) 66*c3a5a609SJeremy L Thompson a = np.arange(10, 10 + 2 * num_elem, dtype="float64") 670ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 680ef72598Sjeremylt 690ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 70*c3a5a609SJeremy L Thompson r = ceed.StridedElemRestriction(num_elem, 2, 1, 2 * num_elem, strides) 710ef72598Sjeremylt 72*c3a5a609SJeremy 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: 78*c3a5a609SJeremy 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 89*c3a5a609SJeremy L Thompson num_elem = 8 90*c3a5a609SJeremy L Thompson elem_size = 2 91*c3a5a609SJeremy L Thompson num_blk = 2 92*c3a5a609SJeremy L Thompson blk_size = 5 930ef72598Sjeremylt 94*c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 95*c3a5a609SJeremy L Thompson a = np.arange(10, 10 + num_elem + 1, dtype="float64") 96*c3a5a609SJeremy L Thompson x.set_array(a, cmode=libceed.COPY_VALUES) 970ef72598Sjeremylt 98*c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 99*c3a5a609SJeremy L Thompson for i in range(num_elem): 1000ef72598Sjeremylt ind[2 * i + 0] = i 1010ef72598Sjeremylt ind[2 * i + 1] = i + 1 102*c3a5a609SJeremy L Thompson r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1, 103*c3a5a609SJeremy L Thompson num_elem + 1, ind, cmode=libceed.COPY_VALUES) 1040ef72598Sjeremylt 105*c3a5a609SJeremy L Thompson y = ceed.Vector(num_blk * blk_size * elem_size) 1060ef72598Sjeremylt y.set_value(0) 1070ef72598Sjeremylt 108*c3a5a609SJeremy L Thompson # NoTranspose 1090ef72598Sjeremylt r.apply(x, y) 110*c3a5a609SJeremy L Thompson layout = r.get_layout() 111*c3a5a609SJeremy L Thompson with y.array_read() as y_array: 112*c3a5a609SJeremy L Thompson for i in range(elem_size): 113*c3a5a609SJeremy L Thompson for j in range(1): 114*c3a5a609SJeremy L Thompson for k in range(num_elem): 115*c3a5a609SJeremy L Thompson block = int(k / blk_size) 116*c3a5a609SJeremy L Thompson elem = k % blk_size 117*c3a5a609SJeremy L Thompson indx = (i * blk_size + elem) * \ 118*c3a5a609SJeremy L Thompson layout[0] + j * blk_size * layout[1] + \ 119*c3a5a609SJeremy L Thompson block * blk_size * layout[2] 120*c3a5a609SJeremy L Thompson assert y_array[indx] == a[ind[k * elem_size + i]] 1210ef72598Sjeremylt 1220ef72598Sjeremylt x.set_value(0) 1230ef72598Sjeremylt r.T.apply(y, x) 124*c3a5a609SJeremy L Thompson with x.array_read() as x_array: 125*c3a5a609SJeremy L Thompson for i in range(num_elem + 1): 126*c3a5a609SJeremy L Thompson assert x_array[i] == (10 + i) * (2.0 if i > 127*c3a5a609SJeremy 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 134*c3a5a609SJeremy L Thompsondef test_208(ceed_resource): 1350ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 1360ef72598Sjeremylt 137*c3a5a609SJeremy L Thompson num_elem = 8 138*c3a5a609SJeremy L Thompson elem_size = 2 139*c3a5a609SJeremy L Thompson num_blk = 2 140*c3a5a609SJeremy L Thompson blk_size = 5 1410ef72598Sjeremylt 142*c3a5a609SJeremy L Thompson x = ceed.Vector(num_elem + 1) 143*c3a5a609SJeremy L Thompson a = np.arange(10, 10 + num_elem + 1, dtype="float64") 144*c3a5a609SJeremy L Thompson x.set_array(a, cmode=libceed.COPY_VALUES) 1450ef72598Sjeremylt 146*c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 147*c3a5a609SJeremy L Thompson for i in range(num_elem): 1480ef72598Sjeremylt ind[2 * i + 0] = i 1490ef72598Sjeremylt ind[2 * i + 1] = i + 1 150*c3a5a609SJeremy L Thompson r = ceed.BlockedElemRestriction(num_elem, elem_size, blk_size, 1, 1, 151*c3a5a609SJeremy L Thompson num_elem + 1, ind, cmode=libceed.COPY_VALUES) 1520ef72598Sjeremylt 153*c3a5a609SJeremy L Thompson y = ceed.Vector(blk_size * elem_size) 1540ef72598Sjeremylt y.set_value(0) 1550ef72598Sjeremylt 156*c3a5a609SJeremy L Thompson # NoTranspose 1570ef72598Sjeremylt r.apply_block(1, x, y) 158*c3a5a609SJeremy L Thompson layout = r.get_layout() 159*c3a5a609SJeremy L Thompson with y.array_read() as y_array: 160*c3a5a609SJeremy L Thompson for i in range(elem_size): 161*c3a5a609SJeremy L Thompson for j in range(1): 162*c3a5a609SJeremy L Thompson for k in range(blk_size, num_elem): 163*c3a5a609SJeremy L Thompson block = int(k / blk_size) 164*c3a5a609SJeremy L Thompson elem = k % blk_size 165*c3a5a609SJeremy L Thompson indx = (i * blk_size + elem) * layout[0] + j * blk_size * \ 166*c3a5a609SJeremy L Thompson layout[1] + block * blk_size * \ 167*c3a5a609SJeremy L Thompson layout[2] - blk_size * elem_size 168*c3a5a609SJeremy 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) 172*c3a5a609SJeremy L Thompson with x.array_read() as x_array: 173*c3a5a609SJeremy L Thompson for i in range(blk_size, num_elem + 1): 174*c3a5a609SJeremy L Thompson assert x_array[i] == (10 + i) * (2.0 if i > 175*c3a5a609SJeremy 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 185*c3a5a609SJeremy L Thompson num_elem = 3 1860ef72598Sjeremylt 187*c3a5a609SJeremy L Thompson ind = np.zeros(4 * num_elem, dtype="int32") 188*c3a5a609SJeremy 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 193*c3a5a609SJeremy 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: 199*c3a5a609SJeremy L Thompson for i in range(3 * num_elem + 1): 200*c3a5a609SJeremy 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 211*c3a5a609SJeremy L Thompson num_elem = 3 2120ef72598Sjeremylt 213*c3a5a609SJeremy L Thompson ind = np.zeros(2 * num_elem, dtype="int32") 214*c3a5a609SJeremy L Thompson for i in range(num_elem): 2150ef72598Sjeremylt ind[2 * i + 0] = i + 0 2160ef72598Sjeremylt ind[2 * i + 1] = i + 1 217*c3a5a609SJeremy 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 234*c3a5a609SJeremy L Thompson num_elem = 3 2350ef72598Sjeremylt 2360ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 237*c3a5a609SJeremy 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 253*c3a5a609SJeremy L Thompson num_elem = 3 2540ef72598Sjeremylt 2550ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 256*c3a5a609SJeremy L Thompson r = ceed.BlockedStridedElemRestriction( 257*c3a5a609SJeremy 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