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 "## CeedQFunction\n", 37*edab6123Sjeremylt "\n", 38*edab6123Sjeremylt "Here we show some basic examples to illustrate the `libceed.QFunction` class. In libCEED, QFunctions represent the spatial terms of the point-wise functions describing the physics at the quadrature points (see [the API documentation](https://libceed.readthedocs.io/en/latest/libCEEDapi.html#api-description)). As shown in the following sketch, QFunctions (such as the one depicted, which defines the Laplacian) are point-wise functions defined at quadrature points. Hence, QFunctions are independent from element shape, resolution and order.\n", 39*edab6123Sjeremylt "\n", 40*edab6123Sjeremylt "![alt text][QFunctionSchematic]\n", 41*edab6123Sjeremylt "\n", 42*edab6123Sjeremylt "[QFunctionSchematic]: ./img/QFunctionSketch.svg \"Schematic of point-wise QFunctions, defined at quadrature points, belonging to elements that can have different shape, resolution and order.\"" 43*edab6123Sjeremylt ] 44*edab6123Sjeremylt }, 45*edab6123Sjeremylt { 46*edab6123Sjeremylt "cell_type": "markdown", 47*edab6123Sjeremylt "metadata": {}, 48*edab6123Sjeremylt "source": [ 49*edab6123Sjeremylt "* In the following example, we create and view two QFunctions (for the setup and apply, respectively, of the mass operator in 1D) from the gallery of available built-in QFunctions in libCEED" 50*edab6123Sjeremylt ] 51*edab6123Sjeremylt }, 52*edab6123Sjeremylt { 53*edab6123Sjeremylt "cell_type": "code", 54*edab6123Sjeremylt "execution_count": null, 55*edab6123Sjeremylt "metadata": {}, 56*edab6123Sjeremylt "outputs": [], 57*edab6123Sjeremylt "source": [ 58*edab6123Sjeremylt "import libceed\n", 59*edab6123Sjeremylt "import numpy as np\n", 60*edab6123Sjeremylt "\n", 61*edab6123Sjeremylt "ceed = libceed.Ceed()\n", 62*edab6123Sjeremylt "\n", 63*edab6123Sjeremylt "qf_setup = ceed.QFunctionByName(\"Mass1DBuild\")\n", 64*edab6123Sjeremylt "qf_mass = ceed.QFunctionByName(\"MassApply\")\n", 65*edab6123Sjeremylt "\n", 66*edab6123Sjeremylt "print(qf_setup)\n", 67*edab6123Sjeremylt "print(qf_mass)" 68*edab6123Sjeremylt ] 69*edab6123Sjeremylt }, 70*edab6123Sjeremylt { 71*edab6123Sjeremylt "cell_type": "markdown", 72*edab6123Sjeremylt "metadata": {}, 73*edab6123Sjeremylt "source": [ 74*edab6123Sjeremylt "* In the following example, we create and evaluate a built-in identity QFunction." 75*edab6123Sjeremylt ] 76*edab6123Sjeremylt }, 77*edab6123Sjeremylt { 78*edab6123Sjeremylt "cell_type": "code", 79*edab6123Sjeremylt "execution_count": null, 80*edab6123Sjeremylt "metadata": {}, 81*edab6123Sjeremylt "outputs": [], 82*edab6123Sjeremylt "source": [ 83*edab6123Sjeremylt "qf = ceed.IdentityQFunction(1, libceed.EVAL_INTERP, libceed.EVAL_INTERP)\n", 84*edab6123Sjeremylt "\n", 85*edab6123Sjeremylt "q = 8\n", 86*edab6123Sjeremylt "\n", 87*edab6123Sjeremylt "u_array = np.zeros(q, dtype=\"float64\")\n", 88*edab6123Sjeremylt "for i in range(q):\n", 89*edab6123Sjeremylt " u_array[i] = i*i\n", 90*edab6123Sjeremylt "\n", 91*edab6123Sjeremylt "u = ceed.Vector(q)\n", 92*edab6123Sjeremylt "u.set_array(u_array, cmode=libceed.USE_POINTER)\n", 93*edab6123Sjeremylt "v = ceed.Vector(q)\n", 94*edab6123Sjeremylt "v.set_value(0)\n", 95*edab6123Sjeremylt "\n", 96*edab6123Sjeremylt "inputs = [ u ]\n", 97*edab6123Sjeremylt "outputs = [ v ]\n", 98*edab6123Sjeremylt "qf.apply(q, inputs, outputs)\n", 99*edab6123Sjeremylt "\n", 100*edab6123Sjeremylt "print('v =', v)" 101*edab6123Sjeremylt ] 102*edab6123Sjeremylt }, 103*edab6123Sjeremylt { 104*edab6123Sjeremylt "cell_type": "markdown", 105*edab6123Sjeremylt "metadata": {}, 106*edab6123Sjeremylt "source": [ 107*edab6123Sjeremylt "* In the following example, we create and evaluate a QFunction (for the mass operator in 1D) from the gallery of available built-in QFunctions in libCEED." 108*edab6123Sjeremylt ] 109*edab6123Sjeremylt }, 110*edab6123Sjeremylt { 111*edab6123Sjeremylt "cell_type": "code", 112*edab6123Sjeremylt "execution_count": null, 113*edab6123Sjeremylt "metadata": {}, 114*edab6123Sjeremylt "outputs": [], 115*edab6123Sjeremylt "source": [ 116*edab6123Sjeremylt "qf_setup = ceed.QFunctionByName(\"Mass1DBuild\")\n", 117*edab6123Sjeremylt "qf_mass = ceed.QFunctionByName(\"MassApply\")\n", 118*edab6123Sjeremylt "\n", 119*edab6123Sjeremylt "q = 8\n", 120*edab6123Sjeremylt "\n", 121*edab6123Sjeremylt "j_array = np.zeros(q, dtype=\"float64\")\n", 122*edab6123Sjeremylt "w_array = np.zeros(q, dtype=\"float64\")\n", 123*edab6123Sjeremylt "u_array = np.zeros(q, dtype=\"float64\")\n", 124*edab6123Sjeremylt "v_true = np.zeros(q, dtype=\"float64\")\n", 125*edab6123Sjeremylt "for i in range(q):\n", 126*edab6123Sjeremylt " x = 2.*i/(q-1) - 1\n", 127*edab6123Sjeremylt " j_array[i] = 1\n", 128*edab6123Sjeremylt " w_array[i] = 1 - x*x\n", 129*edab6123Sjeremylt " u_array[i] = 2 + 3*x + 5*x*x\n", 130*edab6123Sjeremylt " v_true[i] = w_array[i] * u_array[i]\n", 131*edab6123Sjeremylt "\n", 132*edab6123Sjeremylt "j = ceed.Vector(q)\n", 133*edab6123Sjeremylt "j.set_array(j_array, cmode=libceed.USE_POINTER)\n", 134*edab6123Sjeremylt "w = ceed.Vector(q)\n", 135*edab6123Sjeremylt "w.set_array(w_array, cmode=libceed.USE_POINTER)\n", 136*edab6123Sjeremylt "u = ceed.Vector(q)\n", 137*edab6123Sjeremylt "u.set_array(u_array, cmode=libceed.USE_POINTER)\n", 138*edab6123Sjeremylt "v = ceed.Vector(q)\n", 139*edab6123Sjeremylt "v.set_value(0)\n", 140*edab6123Sjeremylt "qdata = ceed.Vector(q)\n", 141*edab6123Sjeremylt "qdata.set_value(0)\n", 142*edab6123Sjeremylt "\n", 143*edab6123Sjeremylt "inputs = [ j, w ]\n", 144*edab6123Sjeremylt "outputs = [ qdata ]\n", 145*edab6123Sjeremylt "qf_setup.apply(q, inputs, outputs)\n", 146*edab6123Sjeremylt "\n", 147*edab6123Sjeremylt "inputs = [ w, u ]\n", 148*edab6123Sjeremylt "outputs = [ v ]\n", 149*edab6123Sjeremylt "qf_mass.apply(q, inputs, outputs)\n", 150*edab6123Sjeremylt "\n", 151*edab6123Sjeremylt "print('v =', v)" 152*edab6123Sjeremylt ] 153*edab6123Sjeremylt }, 154*edab6123Sjeremylt { 155*edab6123Sjeremylt "cell_type": "markdown", 156*edab6123Sjeremylt "metadata": {}, 157*edab6123Sjeremylt "source": [ 158*edab6123Sjeremylt "* In the following example, we create and evaluate a built-in identity QFunction 3 fields per quadrature point." 159*edab6123Sjeremylt ] 160*edab6123Sjeremylt }, 161*edab6123Sjeremylt { 162*edab6123Sjeremylt "cell_type": "code", 163*edab6123Sjeremylt "execution_count": null, 164*edab6123Sjeremylt "metadata": {}, 165*edab6123Sjeremylt "outputs": [], 166*edab6123Sjeremylt "source": [ 167*edab6123Sjeremylt "fields = 3\n", 168*edab6123Sjeremylt "\n", 169*edab6123Sjeremylt "qf = ceed.IdentityQFunction(fields, libceed.EVAL_INTERP, libceed.EVAL_INTERP)\n", 170*edab6123Sjeremylt "\n", 171*edab6123Sjeremylt "q = 8\n", 172*edab6123Sjeremylt "\n", 173*edab6123Sjeremylt "u_array = np.zeros(q*fields, dtype=\"float64\")\n", 174*edab6123Sjeremylt "for i in range(q*fields):\n", 175*edab6123Sjeremylt " u_array[i] = i*i\n", 176*edab6123Sjeremylt "\n", 177*edab6123Sjeremylt "u = ceed.Vector(q*fields)\n", 178*edab6123Sjeremylt "u.set_array(u_array, cmode=libceed.USE_POINTER)\n", 179*edab6123Sjeremylt "v = ceed.Vector(q*fields)\n", 180*edab6123Sjeremylt "v.set_value(0)\n", 181*edab6123Sjeremylt "\n", 182*edab6123Sjeremylt "inputs = [ u ]\n", 183*edab6123Sjeremylt "outputs = [ v ]\n", 184*edab6123Sjeremylt "qf.apply(q, inputs, outputs)\n", 185*edab6123Sjeremylt "\n", 186*edab6123Sjeremylt "print('v =', v)" 187*edab6123Sjeremylt ] 188*edab6123Sjeremylt } 189*edab6123Sjeremylt ], 190*edab6123Sjeremylt "metadata": { 191*edab6123Sjeremylt "kernelspec": { 192*edab6123Sjeremylt "display_name": "Python 3", 193*edab6123Sjeremylt "language": "python", 194*edab6123Sjeremylt "name": "python3" 195*edab6123Sjeremylt }, 196*edab6123Sjeremylt "language_info": { 197*edab6123Sjeremylt "codemirror_mode": { 198*edab6123Sjeremylt "name": "ipython", 199*edab6123Sjeremylt "version": 3 200*edab6123Sjeremylt }, 201*edab6123Sjeremylt "file_extension": ".py", 202*edab6123Sjeremylt "mimetype": "text/x-python", 203*edab6123Sjeremylt "name": "python", 204*edab6123Sjeremylt "nbconvert_exporter": "python", 205*edab6123Sjeremylt "pygments_lexer": "ipython3", 206*edab6123Sjeremylt "version": "3.8.5" 207*edab6123Sjeremylt } 208*edab6123Sjeremylt }, 209*edab6123Sjeremylt "nbformat": 4, 210*edab6123Sjeremylt "nbformat_minor": 4 211*edab6123Sjeremylt} 212