1*edab6123Sjeremylt{ 2*edab6123Sjeremylt "cells": [ 3*edab6123Sjeremylt { 4*edab6123Sjeremylt "cell_type": "markdown", 5*edab6123Sjeremylt "metadata": {}, 6*edab6123Sjeremylt "source": [ 7*edab6123Sjeremylt "# libCEED for Python examples\n", 8*edab6123Sjeremylt "\n", 9*edab6123Sjeremylt "This is a tutorial to illustrate the main feautures of the Python interface for [libCEED](https://github.com/CEED/libCEED/), the low-level API library for efficient high-order discretization methods developed by the co-design [Center for Efficient Exascale Discretizations](https://ceed.exascaleproject.org/) (CEED) of the [Exascale Computing Project](https://www.exascaleproject.org/) (ECP).\n", 10*edab6123Sjeremylt "\n", 11*edab6123Sjeremylt "While libCEED's focus is on high-order finite/spectral element method implementations, the approach is mostly algebraic and thus applicable to other discretizations in factored form, as explained in the [user manual](https://libceed.readthedocs.io/)." 12*edab6123Sjeremylt ] 13*edab6123Sjeremylt }, 14*edab6123Sjeremylt { 15*edab6123Sjeremylt "cell_type": "markdown", 16*edab6123Sjeremylt "metadata": {}, 17*edab6123Sjeremylt "source": [ 18*edab6123Sjeremylt "## Setting up libCEED for Python\n", 19*edab6123Sjeremylt "\n", 20*edab6123Sjeremylt "Install libCEED for Python by running" 21*edab6123Sjeremylt ] 22*edab6123Sjeremylt }, 23*edab6123Sjeremylt { 24*edab6123Sjeremylt "cell_type": "code", 25*edab6123Sjeremylt "execution_count": null, 26*edab6123Sjeremylt "metadata": {}, 27*edab6123Sjeremylt "outputs": [], 28*edab6123Sjeremylt "source": [ 29*edab6123Sjeremylt "! python -m pip install libceed" 30*edab6123Sjeremylt ] 31*edab6123Sjeremylt }, 32*edab6123Sjeremylt { 33*edab6123Sjeremylt "cell_type": "markdown", 34*edab6123Sjeremylt "metadata": {}, 35*edab6123Sjeremylt "source": [ 36*edab6123Sjeremylt "## CeedVector\n", 37*edab6123Sjeremylt "\n", 38*edab6123Sjeremylt "Here we show some basic examples to illustrate the `libceed.Vector` class. In libCEED, CeedVectors constitute the main data structure and serve as input/output for `libceed.Operator`. \n", 39*edab6123Sjeremylt "\n", 40*edab6123Sjeremylt "We illustrate the simple creation of a `libceed.Vector`, how to specify its size, and how to read or manipulate its data." 41*edab6123Sjeremylt ] 42*edab6123Sjeremylt }, 43*edab6123Sjeremylt { 44*edab6123Sjeremylt "cell_type": "code", 45*edab6123Sjeremylt "execution_count": null, 46*edab6123Sjeremylt "metadata": {}, 47*edab6123Sjeremylt "outputs": [], 48*edab6123Sjeremylt "source": [ 49*edab6123Sjeremylt "import libceed\n", 50*edab6123Sjeremylt "\n", 51*edab6123Sjeremylt "ceed = libceed.Ceed()\n", 52*edab6123Sjeremylt "\n", 53*edab6123Sjeremylt "n = 10\n", 54*edab6123Sjeremylt "x = ceed.Vector(n)" 55*edab6123Sjeremylt ] 56*edab6123Sjeremylt }, 57*edab6123Sjeremylt { 58*edab6123Sjeremylt "cell_type": "markdown", 59*edab6123Sjeremylt "metadata": {}, 60*edab6123Sjeremylt "source": [ 61*edab6123Sjeremylt "The size of the `CeedVector` can also be specified as " 62*edab6123Sjeremylt ] 63*edab6123Sjeremylt }, 64*edab6123Sjeremylt { 65*edab6123Sjeremylt "cell_type": "code", 66*edab6123Sjeremylt "execution_count": null, 67*edab6123Sjeremylt "metadata": {}, 68*edab6123Sjeremylt "outputs": [], 69*edab6123Sjeremylt "source": [ 70*edab6123Sjeremylt "x = ceed.Vector(size=10)" 71*edab6123Sjeremylt ] 72*edab6123Sjeremylt }, 73*edab6123Sjeremylt { 74*edab6123Sjeremylt "cell_type": "markdown", 75*edab6123Sjeremylt "metadata": {}, 76*edab6123Sjeremylt "source": [ 77*edab6123Sjeremylt "* In the following example, we associate the data stored in a `libceed.Vector` with a `numpy.array` and use it to set and read the `libceed.Vector`'s data" 78*edab6123Sjeremylt ] 79*edab6123Sjeremylt }, 80*edab6123Sjeremylt { 81*edab6123Sjeremylt "cell_type": "code", 82*edab6123Sjeremylt "execution_count": null, 83*edab6123Sjeremylt "metadata": {}, 84*edab6123Sjeremylt "outputs": [], 85*edab6123Sjeremylt "source": [ 86*edab6123Sjeremylt "import numpy as np\n", 87*edab6123Sjeremylt "\n", 88*edab6123Sjeremylt "ceed = libceed.Ceed()\n", 89*edab6123Sjeremylt "x = ceed.Vector(size=3)\n", 90*edab6123Sjeremylt "\n", 91*edab6123Sjeremylt "a = np.arange(1, 4, dtype=\"float64\")\n", 92*edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 93*edab6123Sjeremylt "\n", 94*edab6123Sjeremylt "with x.array_read() as b:\n", 95*edab6123Sjeremylt " print(b)" 96*edab6123Sjeremylt ] 97*edab6123Sjeremylt }, 98*edab6123Sjeremylt { 99*edab6123Sjeremylt "cell_type": "markdown", 100*edab6123Sjeremylt "metadata": {}, 101*edab6123Sjeremylt "source": [ 102*edab6123Sjeremylt "* In the following example, we set all entries to the same value and then visualize the `libceed.Vector`" 103*edab6123Sjeremylt ] 104*edab6123Sjeremylt }, 105*edab6123Sjeremylt { 106*edab6123Sjeremylt "cell_type": "code", 107*edab6123Sjeremylt "execution_count": null, 108*edab6123Sjeremylt "metadata": {}, 109*edab6123Sjeremylt "outputs": [], 110*edab6123Sjeremylt "source": [ 111*edab6123Sjeremylt "ceed = libceed.Ceed()\n", 112*edab6123Sjeremylt "x = ceed.Vector(size=5)\n", 113*edab6123Sjeremylt "\n", 114*edab6123Sjeremylt "x.set_value(10)\n", 115*edab6123Sjeremylt "\n", 116*edab6123Sjeremylt "print(x)" 117*edab6123Sjeremylt ] 118*edab6123Sjeremylt }, 119*edab6123Sjeremylt { 120*edab6123Sjeremylt "cell_type": "markdown", 121*edab6123Sjeremylt "metadata": {}, 122*edab6123Sjeremylt "source": [ 123*edab6123Sjeremylt "* In the following example, we set one vector from the array of another vector" 124*edab6123Sjeremylt ] 125*edab6123Sjeremylt }, 126*edab6123Sjeremylt { 127*edab6123Sjeremylt "cell_type": "code", 128*edab6123Sjeremylt "execution_count": null, 129*edab6123Sjeremylt "metadata": {}, 130*edab6123Sjeremylt "outputs": [], 131*edab6123Sjeremylt "source": [ 132*edab6123Sjeremylt "ceed = libceed.Ceed()\n", 133*edab6123Sjeremylt "n = 10\n", 134*edab6123Sjeremylt "\n", 135*edab6123Sjeremylt "x = ceed.Vector(n)\n", 136*edab6123Sjeremylt "y = ceed.Vector(n)\n", 137*edab6123Sjeremylt "\n", 138*edab6123Sjeremylt "a = np.arange(1, 1 + n, dtype=\"float64\")\n", 139*edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 140*edab6123Sjeremylt "\n", 141*edab6123Sjeremylt "with x.array() as x_array:\n", 142*edab6123Sjeremylt " y.set_array(x_array, cmode=libceed.USE_POINTER)\n", 143*edab6123Sjeremylt "\n", 144*edab6123Sjeremylt "with y.array_read() as y_array:\n", 145*edab6123Sjeremylt " print(y_array)\n" 146*edab6123Sjeremylt ] 147*edab6123Sjeremylt }, 148*edab6123Sjeremylt { 149*edab6123Sjeremylt "cell_type": "markdown", 150*edab6123Sjeremylt "metadata": {}, 151*edab6123Sjeremylt "source": [ 152*edab6123Sjeremylt "* In the following example, we access and modify only one entry of the `libceed.Vector`" 153*edab6123Sjeremylt ] 154*edab6123Sjeremylt }, 155*edab6123Sjeremylt { 156*edab6123Sjeremylt "cell_type": "code", 157*edab6123Sjeremylt "execution_count": null, 158*edab6123Sjeremylt "metadata": {}, 159*edab6123Sjeremylt "outputs": [], 160*edab6123Sjeremylt "source": [ 161*edab6123Sjeremylt "n = 10\n", 162*edab6123Sjeremylt "\n", 163*edab6123Sjeremylt "x = ceed.Vector(n)\n", 164*edab6123Sjeremylt "a = np.zeros(n, dtype=\"float64\")\n", 165*edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 166*edab6123Sjeremylt "\n", 167*edab6123Sjeremylt "with x.array() as b:\n", 168*edab6123Sjeremylt " b[3] = -3.14;\n", 169*edab6123Sjeremylt "a[3]" 170*edab6123Sjeremylt ] 171*edab6123Sjeremylt }, 172*edab6123Sjeremylt { 173*edab6123Sjeremylt "cell_type": "markdown", 174*edab6123Sjeremylt "metadata": {}, 175*edab6123Sjeremylt "source": [ 176*edab6123Sjeremylt "* In the following example, we compute the $L_1$, $L_2$ (default), and $L_{\\infty}$ norms of a `libceed.Vector` (keeping in mind that these are local norm computations; not accurate for parallel executions with no reductions)." 177*edab6123Sjeremylt ] 178*edab6123Sjeremylt }, 179*edab6123Sjeremylt { 180*edab6123Sjeremylt "cell_type": "code", 181*edab6123Sjeremylt "execution_count": null, 182*edab6123Sjeremylt "metadata": {}, 183*edab6123Sjeremylt "outputs": [], 184*edab6123Sjeremylt "source": [ 185*edab6123Sjeremylt "n = 10\n", 186*edab6123Sjeremylt "x = ceed.Vector(n)\n", 187*edab6123Sjeremylt "\n", 188*edab6123Sjeremylt "a = np.arange(0, n, dtype=\"float64\")\n", 189*edab6123Sjeremylt "for i in range(n):\n", 190*edab6123Sjeremylt " if (i % 2 == 0):\n", 191*edab6123Sjeremylt " a[i] *= -1\n", 192*edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 193*edab6123Sjeremylt "\n", 194*edab6123Sjeremylt "norm_1 = x.norm(normtype=libceed.NORM_1)\n", 195*edab6123Sjeremylt "print(norm_1)\n", 196*edab6123Sjeremylt "\n", 197*edab6123Sjeremylt "norm_2 = x.norm()\n", 198*edab6123Sjeremylt "print(norm_2)\n", 199*edab6123Sjeremylt "\n", 200*edab6123Sjeremylt "norm_max = x.norm(normtype=libceed.NORM_MAX)\n", 201*edab6123Sjeremylt "print(norm_max)" 202*edab6123Sjeremylt ] 203*edab6123Sjeremylt }, 204*edab6123Sjeremylt { 205*edab6123Sjeremylt "cell_type": "markdown", 206*edab6123Sjeremylt "metadata": {}, 207*edab6123Sjeremylt "source": [ 208*edab6123Sjeremylt "* If you have installed libCEED with CUDA support and Numba, you can use device memory in your `libceed.Vector`s. In the following example, we create a `libceed.Vector` with a libCEED contex that supports CUDA, associate the data stored in a CeedVector with a `numpy.array`, and get a Numba `DeviceNDArray` containing the data on the device." 209*edab6123Sjeremylt ] 210*edab6123Sjeremylt }, 211*edab6123Sjeremylt { 212*edab6123Sjeremylt "cell_type": "code", 213*edab6123Sjeremylt "execution_count": null, 214*edab6123Sjeremylt "metadata": {}, 215*edab6123Sjeremylt "outputs": [], 216*edab6123Sjeremylt "source": [ 217*edab6123Sjeremylt "ceed_gpu = libceed.Ceed('/gpu/cuda')\n", 218*edab6123Sjeremylt "\n", 219*edab6123Sjeremylt "n = 10\n", 220*edab6123Sjeremylt "x = ceed_gpu.Vector(n)\n", 221*edab6123Sjeremylt "\n", 222*edab6123Sjeremylt "a = np.arange(1, 1 + n, dtype=\"float64\")\n", 223*edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 224*edab6123Sjeremylt "\n", 225*edab6123Sjeremylt "with x.array_read(memtype=libceed.MEM_DEVICE) as device_array:\n", 226*edab6123Sjeremylt " print(device_array)" 227*edab6123Sjeremylt ] 228*edab6123Sjeremylt } 229*edab6123Sjeremylt ], 230*edab6123Sjeremylt "metadata": { 231*edab6123Sjeremylt "kernelspec": { 232*edab6123Sjeremylt "display_name": "Python 3", 233*edab6123Sjeremylt "language": "python", 234*edab6123Sjeremylt "name": "python3" 235*edab6123Sjeremylt }, 236*edab6123Sjeremylt "language_info": { 237*edab6123Sjeremylt "codemirror_mode": { 238*edab6123Sjeremylt "name": "ipython", 239*edab6123Sjeremylt "version": 3 240*edab6123Sjeremylt }, 241*edab6123Sjeremylt "file_extension": ".py", 242*edab6123Sjeremylt "mimetype": "text/x-python", 243*edab6123Sjeremylt "name": "python", 244*edab6123Sjeremylt "nbconvert_exporter": "python", 245*edab6123Sjeremylt "pygments_lexer": "ipython3", 246*edab6123Sjeremylt "version": "3.8.5" 247*edab6123Sjeremylt } 248*edab6123Sjeremylt }, 249*edab6123Sjeremylt "nbformat": 4, 250*edab6123Sjeremylt "nbformat_minor": 4 251*edab6123Sjeremylt} 252