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 ElemRestriction functionality 19*0ef72598Sjeremylt 20*0ef72598Sjeremyltimport os 21*0ef72598Sjeremyltimport libceed 22*0ef72598Sjeremyltimport numpy as np 23*0ef72598Sjeremyltimport check 24*0ef72598Sjeremylt 25*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 26*0ef72598Sjeremylt# Test creation, use, and destruction of an element restriction 27*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 28*0ef72598Sjeremylt 29*0ef72598Sjeremylt 30*0ef72598Sjeremyltdef test_200(ceed_resource): 31*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 32*0ef72598Sjeremylt 33*0ef72598Sjeremylt ne = 3 34*0ef72598Sjeremylt 35*0ef72598Sjeremylt x = ceed.Vector(ne + 1) 36*0ef72598Sjeremylt a = np.arange(10, 10 + ne + 1, dtype="float64") 37*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 38*0ef72598Sjeremylt 39*0ef72598Sjeremylt ind = np.zeros(2 * ne, dtype="int32") 40*0ef72598Sjeremylt for i in range(ne): 41*0ef72598Sjeremylt ind[2 * i + 0] = i 42*0ef72598Sjeremylt ind[2 * i + 1] = i + 1 43*0ef72598Sjeremylt r = ceed.ElemRestriction(ne, 2, 1, 1, ne + 1, ind, 44*0ef72598Sjeremylt cmode=libceed.USE_POINTER) 45*0ef72598Sjeremylt 46*0ef72598Sjeremylt y = ceed.Vector(2 * ne) 47*0ef72598Sjeremylt y.set_value(0) 48*0ef72598Sjeremylt 49*0ef72598Sjeremylt r.apply(x, y) 50*0ef72598Sjeremylt 51*0ef72598Sjeremylt with y.array_read() as y_array: 52*0ef72598Sjeremylt for i in range(2 * ne): 53*0ef72598Sjeremylt assert 10 + (i + 1) // 2 == y_array[i] 54*0ef72598Sjeremylt 55*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 56*0ef72598Sjeremylt# Test creation, use, and destruction of a strided element restriction 57*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 58*0ef72598Sjeremylt 59*0ef72598Sjeremylt 60*0ef72598Sjeremyltdef test_201(ceed_resource): 61*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 62*0ef72598Sjeremylt 63*0ef72598Sjeremylt ne = 3 64*0ef72598Sjeremylt 65*0ef72598Sjeremylt x = ceed.Vector(2 * ne) 66*0ef72598Sjeremylt a = np.arange(10, 10 + 2 * ne, dtype="float64") 67*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 68*0ef72598Sjeremylt 69*0ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 70*0ef72598Sjeremylt r = ceed.StridedElemRestriction(ne, 2, 1, 2 * ne, strides) 71*0ef72598Sjeremylt 72*0ef72598Sjeremylt y = ceed.Vector(2 * ne) 73*0ef72598Sjeremylt y.set_value(0) 74*0ef72598Sjeremylt 75*0ef72598Sjeremylt r.apply(x, y) 76*0ef72598Sjeremylt 77*0ef72598Sjeremylt with y.array_read() as y_array: 78*0ef72598Sjeremylt for i in range(2 * ne): 79*0ef72598Sjeremylt assert 10 + i == y_array[i] 80*0ef72598Sjeremylt 81*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 82*0ef72598Sjeremylt# Test creation and destruction of a blocked element restriction 83*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 84*0ef72598Sjeremylt 85*0ef72598Sjeremylt 86*0ef72598Sjeremyltdef test_202(ceed_resource, capsys): 87*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 88*0ef72598Sjeremylt 89*0ef72598Sjeremylt ne = 8 90*0ef72598Sjeremylt blksize = 5 91*0ef72598Sjeremylt 92*0ef72598Sjeremylt x = ceed.Vector(ne + 1) 93*0ef72598Sjeremylt a = np.arange(10, 10 + ne + 1, dtype="float64") 94*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 95*0ef72598Sjeremylt 96*0ef72598Sjeremylt ind = np.zeros(2 * ne, dtype="int32") 97*0ef72598Sjeremylt for i in range(ne): 98*0ef72598Sjeremylt ind[2 * i + 0] = i 99*0ef72598Sjeremylt ind[2 * i + 1] = i + 1 100*0ef72598Sjeremylt r = ceed.BlockedElemRestriction(ne, 2, blksize, 1, 1, ne + 1, ind, 101*0ef72598Sjeremylt cmode=libceed.USE_POINTER) 102*0ef72598Sjeremylt 103*0ef72598Sjeremylt y = ceed.Vector(2 * blksize * 2) 104*0ef72598Sjeremylt y.set_value(0) 105*0ef72598Sjeremylt 106*0ef72598Sjeremylt r.apply(x, y) 107*0ef72598Sjeremylt 108*0ef72598Sjeremylt print(y) 109*0ef72598Sjeremylt 110*0ef72598Sjeremylt x.set_value(0) 111*0ef72598Sjeremylt r.T.apply(y, x) 112*0ef72598Sjeremylt print(x) 113*0ef72598Sjeremylt 114*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 115*0ef72598Sjeremylt assert not stderr 116*0ef72598Sjeremylt assert stdout == ref_stdout 117*0ef72598Sjeremylt 118*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 119*0ef72598Sjeremylt# Test creation, use, and destruction of a blocked element restriction 120*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 121*0ef72598Sjeremylt 122*0ef72598Sjeremylt 123*0ef72598Sjeremyltdef test_208(ceed_resource, capsys): 124*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 125*0ef72598Sjeremylt 126*0ef72598Sjeremylt ne = 8 127*0ef72598Sjeremylt blksize = 5 128*0ef72598Sjeremylt 129*0ef72598Sjeremylt x = ceed.Vector(ne + 1) 130*0ef72598Sjeremylt a = np.arange(10, 10 + ne + 1, dtype="float64") 131*0ef72598Sjeremylt x.set_array(a, cmode=libceed.USE_POINTER) 132*0ef72598Sjeremylt 133*0ef72598Sjeremylt ind = np.zeros(2 * ne, dtype="int32") 134*0ef72598Sjeremylt for i in range(ne): 135*0ef72598Sjeremylt ind[2 * i + 0] = i 136*0ef72598Sjeremylt ind[2 * i + 1] = i + 1 137*0ef72598Sjeremylt r = ceed.BlockedElemRestriction(ne, 2, blksize, 1, 1, ne + 1, ind, 138*0ef72598Sjeremylt cmode=libceed.USE_POINTER) 139*0ef72598Sjeremylt 140*0ef72598Sjeremylt y = ceed.Vector(blksize * 2) 141*0ef72598Sjeremylt y.set_value(0) 142*0ef72598Sjeremylt 143*0ef72598Sjeremylt r.apply_block(1, x, y) 144*0ef72598Sjeremylt 145*0ef72598Sjeremylt print(y) 146*0ef72598Sjeremylt 147*0ef72598Sjeremylt x.set_value(0) 148*0ef72598Sjeremylt r.T.apply_block(1, y, x) 149*0ef72598Sjeremylt print(x) 150*0ef72598Sjeremylt 151*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 152*0ef72598Sjeremylt assert not stderr 153*0ef72598Sjeremylt assert stdout == ref_stdout 154*0ef72598Sjeremylt 155*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 156*0ef72598Sjeremylt# Test getting the multiplicity of the indices in an element restriction 157*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 158*0ef72598Sjeremylt 159*0ef72598Sjeremylt 160*0ef72598Sjeremyltdef test_209(ceed_resource): 161*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 162*0ef72598Sjeremylt 163*0ef72598Sjeremylt ne = 3 164*0ef72598Sjeremylt 165*0ef72598Sjeremylt ind = np.zeros(4 * ne, dtype="int32") 166*0ef72598Sjeremylt for i in range(ne): 167*0ef72598Sjeremylt ind[4 * i + 0] = i * 3 + 0 168*0ef72598Sjeremylt ind[4 * i + 1] = i * 3 + 1 169*0ef72598Sjeremylt ind[4 * i + 2] = i * 3 + 2 170*0ef72598Sjeremylt ind[4 * i + 3] = i * 3 + 3 171*0ef72598Sjeremylt r = ceed.ElemRestriction(ne, 4, 1, 1, 3 * ne + 1, ind, 172*0ef72598Sjeremylt cmode=libceed.USE_POINTER) 173*0ef72598Sjeremylt 174*0ef72598Sjeremylt mult = r.get_multiplicity() 175*0ef72598Sjeremylt 176*0ef72598Sjeremylt with mult.array_read() as mult_array: 177*0ef72598Sjeremylt for i in range(3 * ne + 1): 178*0ef72598Sjeremylt val = 1 + (1 if (i > 0 and i < 3 * ne and i % 3 == 0) else 0) 179*0ef72598Sjeremylt assert val == mult_array[i] 180*0ef72598Sjeremylt 181*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 182*0ef72598Sjeremylt# Test creation and view of an element restriction 183*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 184*0ef72598Sjeremylt 185*0ef72598Sjeremylt 186*0ef72598Sjeremyltdef test_210(ceed_resource, capsys): 187*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 188*0ef72598Sjeremylt 189*0ef72598Sjeremylt ne = 3 190*0ef72598Sjeremylt 191*0ef72598Sjeremylt ind = np.zeros(2 * ne, dtype="int32") 192*0ef72598Sjeremylt for i in range(ne): 193*0ef72598Sjeremylt ind[2 * i + 0] = i + 0 194*0ef72598Sjeremylt ind[2 * i + 1] = i + 1 195*0ef72598Sjeremylt r = ceed.ElemRestriction(ne, 2, 1, 1, ne + 1, ind, 196*0ef72598Sjeremylt cmode=libceed.USE_POINTER) 197*0ef72598Sjeremylt 198*0ef72598Sjeremylt print(r) 199*0ef72598Sjeremylt 200*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 201*0ef72598Sjeremylt assert not stderr 202*0ef72598Sjeremylt assert stdout == ref_stdout 203*0ef72598Sjeremylt 204*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 205*0ef72598Sjeremylt# Test creation and view of a strided element restriction 206*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 207*0ef72598Sjeremylt 208*0ef72598Sjeremylt 209*0ef72598Sjeremyltdef test_211(ceed_resource, capsys): 210*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 211*0ef72598Sjeremylt 212*0ef72598Sjeremylt ne = 3 213*0ef72598Sjeremylt 214*0ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 215*0ef72598Sjeremylt r = ceed.StridedElemRestriction(ne, 2, 1, ne + 1, strides) 216*0ef72598Sjeremylt 217*0ef72598Sjeremylt print(r) 218*0ef72598Sjeremylt 219*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 220*0ef72598Sjeremylt assert not stderr 221*0ef72598Sjeremylt assert stdout == ref_stdout 222*0ef72598Sjeremylt 223*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 224*0ef72598Sjeremylt# Test creation and view of a blocked strided element restriction 225*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 226*0ef72598Sjeremylt 227*0ef72598Sjeremylt 228*0ef72598Sjeremyltdef test_212(ceed_resource, capsys): 229*0ef72598Sjeremylt ceed = libceed.Ceed(ceed_resource) 230*0ef72598Sjeremylt 231*0ef72598Sjeremylt ne = 3 232*0ef72598Sjeremylt 233*0ef72598Sjeremylt strides = np.array([1, 2, 2], dtype="int32") 234*0ef72598Sjeremylt r = ceed.BlockedStridedElemRestriction(ne, 2, 2, 1, ne + 1, strides) 235*0ef72598Sjeremylt 236*0ef72598Sjeremylt print(r) 237*0ef72598Sjeremylt 238*0ef72598Sjeremylt stdout, stderr, ref_stdout = check.output(capsys) 239*0ef72598Sjeremylt assert not stderr 240*0ef72598Sjeremylt assert stdout == ref_stdout 241*0ef72598Sjeremylt 242*0ef72598Sjeremylt# ------------------------------------------------------------------------------- 243