1edab6123Sjeremylt{ 2edab6123Sjeremylt "cells": [ 3edab6123Sjeremylt { 4edab6123Sjeremylt "cell_type": "markdown", 5edab6123Sjeremylt "metadata": {}, 6edab6123Sjeremylt "source": [ 7edab6123Sjeremylt "# libCEED for Python examples\n", 8edab6123Sjeremylt "\n", 9edab6123Sjeremylt "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", 10edab6123Sjeremylt "\n", 11*13964f07SJed Brown "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.org/)." 12edab6123Sjeremylt ] 13edab6123Sjeremylt }, 14edab6123Sjeremylt { 15edab6123Sjeremylt "cell_type": "markdown", 16edab6123Sjeremylt "metadata": {}, 17edab6123Sjeremylt "source": [ 18edab6123Sjeremylt "## Setting up libCEED for Python\n", 19edab6123Sjeremylt "\n", 20edab6123Sjeremylt "Install libCEED for Python by running" 21edab6123Sjeremylt ] 22edab6123Sjeremylt }, 23edab6123Sjeremylt { 24edab6123Sjeremylt "cell_type": "code", 25edab6123Sjeremylt "execution_count": null, 26edab6123Sjeremylt "metadata": {}, 27edab6123Sjeremylt "outputs": [], 28edab6123Sjeremylt "source": [ 29edab6123Sjeremylt "! python -m pip install libceed" 30edab6123Sjeremylt ] 31edab6123Sjeremylt }, 32edab6123Sjeremylt { 33edab6123Sjeremylt "cell_type": "markdown", 34edab6123Sjeremylt "metadata": {}, 35edab6123Sjeremylt "source": [ 36edab6123Sjeremylt "## CeedVector\n", 37edab6123Sjeremylt "\n", 38edab6123Sjeremylt "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", 39edab6123Sjeremylt "\n", 40edab6123Sjeremylt "We illustrate the simple creation of a `libceed.Vector`, how to specify its size, and how to read or manipulate its data." 41edab6123Sjeremylt ] 42edab6123Sjeremylt }, 43edab6123Sjeremylt { 44edab6123Sjeremylt "cell_type": "code", 45edab6123Sjeremylt "execution_count": null, 46edab6123Sjeremylt "metadata": {}, 47edab6123Sjeremylt "outputs": [], 48edab6123Sjeremylt "source": [ 49edab6123Sjeremylt "import libceed\n", 50edab6123Sjeremylt "\n", 51edab6123Sjeremylt "ceed = libceed.Ceed()\n", 52edab6123Sjeremylt "\n", 53edab6123Sjeremylt "n = 10\n", 54edab6123Sjeremylt "x = ceed.Vector(n)" 55edab6123Sjeremylt ] 56edab6123Sjeremylt }, 57edab6123Sjeremylt { 58edab6123Sjeremylt "cell_type": "markdown", 59edab6123Sjeremylt "metadata": {}, 60edab6123Sjeremylt "source": [ 61edab6123Sjeremylt "The size of the `CeedVector` can also be specified as " 62edab6123Sjeremylt ] 63edab6123Sjeremylt }, 64edab6123Sjeremylt { 65edab6123Sjeremylt "cell_type": "code", 66edab6123Sjeremylt "execution_count": null, 67edab6123Sjeremylt "metadata": {}, 68edab6123Sjeremylt "outputs": [], 69edab6123Sjeremylt "source": [ 70edab6123Sjeremylt "x = ceed.Vector(size=10)" 71edab6123Sjeremylt ] 72edab6123Sjeremylt }, 73edab6123Sjeremylt { 74edab6123Sjeremylt "cell_type": "markdown", 75edab6123Sjeremylt "metadata": {}, 76edab6123Sjeremylt "source": [ 77edab6123Sjeremylt "* 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" 78edab6123Sjeremylt ] 79edab6123Sjeremylt }, 80edab6123Sjeremylt { 81edab6123Sjeremylt "cell_type": "code", 82edab6123Sjeremylt "execution_count": null, 83edab6123Sjeremylt "metadata": {}, 84edab6123Sjeremylt "outputs": [], 85edab6123Sjeremylt "source": [ 86edab6123Sjeremylt "import numpy as np\n", 87edab6123Sjeremylt "\n", 88edab6123Sjeremylt "ceed = libceed.Ceed()\n", 89edab6123Sjeremylt "x = ceed.Vector(size=3)\n", 90edab6123Sjeremylt "\n", 91edab6123Sjeremylt "a = np.arange(1, 4, dtype=\"float64\")\n", 92edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 93edab6123Sjeremylt "\n", 94edab6123Sjeremylt "with x.array_read() as b:\n", 95edab6123Sjeremylt " print(b)" 96edab6123Sjeremylt ] 97edab6123Sjeremylt }, 98edab6123Sjeremylt { 99edab6123Sjeremylt "cell_type": "markdown", 100edab6123Sjeremylt "metadata": {}, 101edab6123Sjeremylt "source": [ 102edab6123Sjeremylt "* In the following example, we set all entries to the same value and then visualize the `libceed.Vector`" 103edab6123Sjeremylt ] 104edab6123Sjeremylt }, 105edab6123Sjeremylt { 106edab6123Sjeremylt "cell_type": "code", 107edab6123Sjeremylt "execution_count": null, 108edab6123Sjeremylt "metadata": {}, 109edab6123Sjeremylt "outputs": [], 110edab6123Sjeremylt "source": [ 111edab6123Sjeremylt "ceed = libceed.Ceed()\n", 112edab6123Sjeremylt "x = ceed.Vector(size=5)\n", 113edab6123Sjeremylt "\n", 114edab6123Sjeremylt "x.set_value(10)\n", 115edab6123Sjeremylt "\n", 116edab6123Sjeremylt "print(x)" 117edab6123Sjeremylt ] 118edab6123Sjeremylt }, 119edab6123Sjeremylt { 120edab6123Sjeremylt "cell_type": "markdown", 121edab6123Sjeremylt "metadata": {}, 122edab6123Sjeremylt "source": [ 123edab6123Sjeremylt "* In the following example, we set one vector from the array of another vector" 124edab6123Sjeremylt ] 125edab6123Sjeremylt }, 126edab6123Sjeremylt { 127edab6123Sjeremylt "cell_type": "code", 128edab6123Sjeremylt "execution_count": null, 129edab6123Sjeremylt "metadata": {}, 130edab6123Sjeremylt "outputs": [], 131edab6123Sjeremylt "source": [ 132edab6123Sjeremylt "ceed = libceed.Ceed()\n", 133edab6123Sjeremylt "n = 10\n", 134edab6123Sjeremylt "\n", 135edab6123Sjeremylt "x = ceed.Vector(n)\n", 136edab6123Sjeremylt "y = ceed.Vector(n)\n", 137edab6123Sjeremylt "\n", 138edab6123Sjeremylt "a = np.arange(1, 1 + n, dtype=\"float64\")\n", 139edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 140edab6123Sjeremylt "\n", 141edab6123Sjeremylt "with x.array() as x_array:\n", 142edab6123Sjeremylt " y.set_array(x_array, cmode=libceed.USE_POINTER)\n", 143edab6123Sjeremylt "\n", 144edab6123Sjeremylt "with y.array_read() as y_array:\n", 145edab6123Sjeremylt " print(y_array)\n" 146edab6123Sjeremylt ] 147edab6123Sjeremylt }, 148edab6123Sjeremylt { 149edab6123Sjeremylt "cell_type": "markdown", 150edab6123Sjeremylt "metadata": {}, 151edab6123Sjeremylt "source": [ 152edab6123Sjeremylt "* In the following example, we access and modify only one entry of the `libceed.Vector`" 153edab6123Sjeremylt ] 154edab6123Sjeremylt }, 155edab6123Sjeremylt { 156edab6123Sjeremylt "cell_type": "code", 157edab6123Sjeremylt "execution_count": null, 158edab6123Sjeremylt "metadata": {}, 159edab6123Sjeremylt "outputs": [], 160edab6123Sjeremylt "source": [ 161edab6123Sjeremylt "n = 10\n", 162edab6123Sjeremylt "\n", 163edab6123Sjeremylt "x = ceed.Vector(n)\n", 164edab6123Sjeremylt "a = np.zeros(n, dtype=\"float64\")\n", 165edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 166edab6123Sjeremylt "\n", 167edab6123Sjeremylt "with x.array() as b:\n", 168edab6123Sjeremylt " b[3] = -3.14;\n", 169edab6123Sjeremylt "a[3]" 170edab6123Sjeremylt ] 171edab6123Sjeremylt }, 172edab6123Sjeremylt { 173edab6123Sjeremylt "cell_type": "markdown", 174edab6123Sjeremylt "metadata": {}, 175edab6123Sjeremylt "source": [ 176edab6123Sjeremylt "* 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)." 177edab6123Sjeremylt ] 178edab6123Sjeremylt }, 179edab6123Sjeremylt { 180edab6123Sjeremylt "cell_type": "code", 181edab6123Sjeremylt "execution_count": null, 182edab6123Sjeremylt "metadata": {}, 183edab6123Sjeremylt "outputs": [], 184edab6123Sjeremylt "source": [ 185edab6123Sjeremylt "n = 10\n", 186edab6123Sjeremylt "x = ceed.Vector(n)\n", 187edab6123Sjeremylt "\n", 188edab6123Sjeremylt "a = np.arange(0, n, dtype=\"float64\")\n", 189edab6123Sjeremylt "for i in range(n):\n", 190edab6123Sjeremylt " if (i % 2 == 0):\n", 191edab6123Sjeremylt " a[i] *= -1\n", 192edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 193edab6123Sjeremylt "\n", 194edab6123Sjeremylt "norm_1 = x.norm(normtype=libceed.NORM_1)\n", 195edab6123Sjeremylt "print(norm_1)\n", 196edab6123Sjeremylt "\n", 197edab6123Sjeremylt "norm_2 = x.norm()\n", 198edab6123Sjeremylt "print(norm_2)\n", 199edab6123Sjeremylt "\n", 200edab6123Sjeremylt "norm_max = x.norm(normtype=libceed.NORM_MAX)\n", 201edab6123Sjeremylt "print(norm_max)" 202edab6123Sjeremylt ] 203edab6123Sjeremylt }, 204edab6123Sjeremylt { 205edab6123Sjeremylt "cell_type": "markdown", 206edab6123Sjeremylt "metadata": {}, 207edab6123Sjeremylt "source": [ 208edab6123Sjeremylt "* 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." 209edab6123Sjeremylt ] 210edab6123Sjeremylt }, 211edab6123Sjeremylt { 212edab6123Sjeremylt "cell_type": "code", 213edab6123Sjeremylt "execution_count": null, 214edab6123Sjeremylt "metadata": {}, 215edab6123Sjeremylt "outputs": [], 216edab6123Sjeremylt "source": [ 217edab6123Sjeremylt "ceed_gpu = libceed.Ceed('/gpu/cuda')\n", 218edab6123Sjeremylt "\n", 219edab6123Sjeremylt "n = 10\n", 220edab6123Sjeremylt "x = ceed_gpu.Vector(n)\n", 221edab6123Sjeremylt "\n", 222edab6123Sjeremylt "a = np.arange(1, 1 + n, dtype=\"float64\")\n", 223edab6123Sjeremylt "x.set_array(a, cmode=libceed.USE_POINTER)\n", 224edab6123Sjeremylt "\n", 225edab6123Sjeremylt "with x.array_read(memtype=libceed.MEM_DEVICE) as device_array:\n", 226edab6123Sjeremylt " print(device_array)" 227edab6123Sjeremylt ] 228edab6123Sjeremylt } 229edab6123Sjeremylt ], 230edab6123Sjeremylt "metadata": { 231edab6123Sjeremylt "kernelspec": { 232edab6123Sjeremylt "display_name": "Python 3", 233edab6123Sjeremylt "language": "python", 234edab6123Sjeremylt "name": "python3" 235edab6123Sjeremylt }, 236edab6123Sjeremylt "language_info": { 237edab6123Sjeremylt "codemirror_mode": { 238edab6123Sjeremylt "name": "ipython", 239edab6123Sjeremylt "version": 3 240edab6123Sjeremylt }, 241edab6123Sjeremylt "file_extension": ".py", 242edab6123Sjeremylt "mimetype": "text/x-python", 243edab6123Sjeremylt "name": "python", 244edab6123Sjeremylt "nbconvert_exporter": "python", 245edab6123Sjeremylt "pygments_lexer": "ipython3", 246edab6123Sjeremylt "version": "3.8.5" 247edab6123Sjeremylt } 248edab6123Sjeremylt }, 249edab6123Sjeremylt "nbformat": 4, 250edab6123Sjeremylt "nbformat_minor": 4 251edab6123Sjeremylt} 252