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 "## CeedBasis\n", 37edab6123Sjeremylt "\n", 38*13964f07SJed Brown "Here we show some basic examples to illustrate the `libceed.Basis` class. In libCEED, a `libceed.Basis` defines the finite element basis and associated quadrature rule (see [the API documentation](https://libceed.org/en/latest/libCEEDapi.html#finite-element-operator-decomposition))." 39edab6123Sjeremylt ] 40edab6123Sjeremylt }, 41edab6123Sjeremylt { 42edab6123Sjeremylt "cell_type": "markdown", 43edab6123Sjeremylt "metadata": {}, 44edab6123Sjeremylt "source": [ 45edab6123Sjeremylt "First we declare some auxiliary functions needed in the following examples" 46edab6123Sjeremylt ] 47edab6123Sjeremylt }, 48edab6123Sjeremylt { 49edab6123Sjeremylt "cell_type": "code", 50edab6123Sjeremylt "execution_count": null, 51edab6123Sjeremylt "metadata": {}, 52edab6123Sjeremylt "outputs": [], 53edab6123Sjeremylt "source": [ 54edab6123Sjeremylt "%matplotlib inline\n", 55edab6123Sjeremylt "import numpy as np\n", 56edab6123Sjeremylt "import matplotlib.pyplot as plt\n", 57edab6123Sjeremylt "plt.style.use('ggplot')\n", 58edab6123Sjeremylt "\n", 59edab6123Sjeremylt "def eval(dim, x):\n", 60edab6123Sjeremylt " result, center = 1, 0.1\n", 61edab6123Sjeremylt " for d in range(dim):\n", 62edab6123Sjeremylt " result *= np.tanh(x[d] - center)\n", 63edab6123Sjeremylt " center += 0.1\n", 64edab6123Sjeremylt " return result\n", 65edab6123Sjeremylt "\n", 66edab6123Sjeremylt "def feval(x1, x2):\n", 67edab6123Sjeremylt " return x1*x1 + x2*x2 + x1*x2 + 1\n", 68edab6123Sjeremylt "\n", 69edab6123Sjeremylt "def dfeval(x1, x2):\n", 70edab6123Sjeremylt " return 2*x1 + x2" 71edab6123Sjeremylt ] 72edab6123Sjeremylt }, 73edab6123Sjeremylt { 74edab6123Sjeremylt "cell_type": "markdown", 75edab6123Sjeremylt "metadata": {}, 76edab6123Sjeremylt "source": [ 77edab6123Sjeremylt "## $H^1$ Lagrange bases in 1D\n", 78edab6123Sjeremylt "\n", 79edab6123Sjeremylt "The Lagrange interpolation nodes are at the Gauss-Lobatto points, so interpolation to Gauss-Lobatto quadrature points is the identity." 80edab6123Sjeremylt ] 81edab6123Sjeremylt }, 82edab6123Sjeremylt { 83edab6123Sjeremylt "cell_type": "code", 84edab6123Sjeremylt "execution_count": null, 85edab6123Sjeremylt "metadata": {}, 86edab6123Sjeremylt "outputs": [], 87edab6123Sjeremylt "source": [ 88edab6123Sjeremylt "import libceed\n", 89edab6123Sjeremylt "\n", 90edab6123Sjeremylt "ceed = libceed.Ceed()\n", 91edab6123Sjeremylt "\n", 92edab6123Sjeremylt "b = ceed.BasisTensorH1Lagrange(\n", 93edab6123Sjeremylt " dim=1, # topological dimension\n", 94edab6123Sjeremylt " ncomp=1, # number of components\n", 95edab6123Sjeremylt " P=4, # number of basis functions (nodes) per dimension\n", 96edab6123Sjeremylt " Q=4, # number of quadrature points per dimension\n", 97edab6123Sjeremylt " qmode=libceed.GAUSS_LOBATTO)\n", 98edab6123Sjeremylt "print(b)" 99edab6123Sjeremylt ] 100edab6123Sjeremylt }, 101edab6123Sjeremylt { 102edab6123Sjeremylt "cell_type": "markdown", 103edab6123Sjeremylt "metadata": {}, 104edab6123Sjeremylt "source": [ 105edab6123Sjeremylt "Although a `libceed.Basis` is fully discrete, we can use the Lagrange construction to extend the basis to continuous functions by applying `EVAL_INTERP` to the identity. This is the Vandermonde matrix of the continuous basis." 106edab6123Sjeremylt ] 107edab6123Sjeremylt }, 108edab6123Sjeremylt { 109edab6123Sjeremylt "cell_type": "code", 110edab6123Sjeremylt "execution_count": null, 111edab6123Sjeremylt "metadata": {}, 112edab6123Sjeremylt "outputs": [], 113edab6123Sjeremylt "source": [ 114edab6123Sjeremylt "P = b.get_num_nodes()\n", 115edab6123Sjeremylt "nviz = 50\n", 116edab6123Sjeremylt "bviz = ceed.BasisTensorH1Lagrange(1, 1, P, nviz, libceed.GAUSS_LOBATTO)\n", 117edab6123Sjeremylt "\n", 118edab6123Sjeremylt "# Construct P \"elements\" with one node activated\n", 119edab6123Sjeremylt "I = ceed.Vector(P * P)\n", 120edab6123Sjeremylt "with I.array(P, P) as x:\n", 121edab6123Sjeremylt " x[...] = np.eye(P)\n", 122edab6123Sjeremylt "\n", 123edab6123Sjeremylt "Bvander = ceed.Vector(P * nviz)\n", 124edab6123Sjeremylt "bviz.apply(4, libceed.EVAL_INTERP, I, Bvander)\n", 125edab6123Sjeremylt "\n", 126edab6123Sjeremylt "qviz, _weight = ceed.lobatto_quadrature(nviz)\n", 127edab6123Sjeremylt "with Bvander.array_read(nviz, P) as B:\n", 128edab6123Sjeremylt " plt.plot(qviz, B)\n", 129edab6123Sjeremylt "\n", 130edab6123Sjeremylt "# Mark tho Lobatto nodes\n", 131edab6123Sjeremylt "qb, _weight = ceed.lobatto_quadrature(P)\n", 132edab6123Sjeremylt "plt.plot(qb, 0*qb, 'ok');" 133edab6123Sjeremylt ] 134edab6123Sjeremylt }, 135edab6123Sjeremylt { 136edab6123Sjeremylt "cell_type": "markdown", 137edab6123Sjeremylt "metadata": {}, 138edab6123Sjeremylt "source": [ 139edab6123Sjeremylt "In contrast, the Gauss quadrature points are not collocated, and thus all basis functions are generally nonzero at every quadrature point." 140edab6123Sjeremylt ] 141edab6123Sjeremylt }, 142edab6123Sjeremylt { 143edab6123Sjeremylt "cell_type": "code", 144edab6123Sjeremylt "execution_count": null, 145edab6123Sjeremylt "metadata": {}, 146edab6123Sjeremylt "outputs": [], 147edab6123Sjeremylt "source": [ 148edab6123Sjeremylt "b = ceed.BasisTensorH1Lagrange(1, 1, 4, 4, libceed.GAUSS)\n", 149edab6123Sjeremylt "print(b)\n", 150edab6123Sjeremylt "\n", 151edab6123Sjeremylt "with Bvander.array_read(nviz, P) as B:\n", 152edab6123Sjeremylt " plt.plot(qviz, B)\n", 153edab6123Sjeremylt "# Mark tho Gauss quadrature points\n", 154edab6123Sjeremylt "qb, _weight = ceed.gauss_quadrature(P)\n", 155edab6123Sjeremylt "plt.plot(qb, 0*qb, 'ok');" 156edab6123Sjeremylt ] 157edab6123Sjeremylt }, 158edab6123Sjeremylt { 159edab6123Sjeremylt "cell_type": "markdown", 160edab6123Sjeremylt "metadata": {}, 161edab6123Sjeremylt "source": [ 162edab6123Sjeremylt "Although the underlying functions are not an intrinsic property of a `libceed.Basis` in libCEED, the sizes are.\n", 163edab6123Sjeremylt "Here, we create a 3D tensor product element with more quadrature points than Lagrange interpolation nodes." 164edab6123Sjeremylt ] 165edab6123Sjeremylt }, 166edab6123Sjeremylt { 167edab6123Sjeremylt "cell_type": "code", 168edab6123Sjeremylt "execution_count": null, 169edab6123Sjeremylt "metadata": {}, 170edab6123Sjeremylt "outputs": [], 171edab6123Sjeremylt "source": [ 172edab6123Sjeremylt "b = ceed.BasisTensorH1Lagrange(3, 1, 4, 5, libceed.GAUSS_LOBATTO)\n", 173edab6123Sjeremylt "\n", 174edab6123Sjeremylt "p = b.get_num_nodes()\n", 175edab6123Sjeremylt "print('p =', p)\n", 176edab6123Sjeremylt "\n", 177edab6123Sjeremylt "q = b.get_num_quadrature_points()\n", 178edab6123Sjeremylt "print('q =', q)" 179edab6123Sjeremylt ] 180edab6123Sjeremylt }, 181edab6123Sjeremylt { 182edab6123Sjeremylt "cell_type": "markdown", 183edab6123Sjeremylt "metadata": {}, 184edab6123Sjeremylt "source": [ 185edab6123Sjeremylt "* In the following example, we demonstrate the application of an interpolatory basis in multiple dimensions" 186edab6123Sjeremylt ] 187edab6123Sjeremylt }, 188edab6123Sjeremylt { 189edab6123Sjeremylt "cell_type": "code", 190edab6123Sjeremylt "execution_count": null, 191edab6123Sjeremylt "metadata": {}, 192edab6123Sjeremylt "outputs": [], 193edab6123Sjeremylt "source": [ 194edab6123Sjeremylt "for dim in range(1, 4):\n", 195edab6123Sjeremylt " Q = 4\n", 196edab6123Sjeremylt " Qdim = Q**dim\n", 197edab6123Sjeremylt " Xdim = 2**dim\n", 198edab6123Sjeremylt " x = np.empty(Xdim*dim, dtype=\"float64\")\n", 199edab6123Sjeremylt " uq = np.empty(Qdim, dtype=\"float64\")\n", 200edab6123Sjeremylt "\n", 201edab6123Sjeremylt " for d in range(dim):\n", 202edab6123Sjeremylt " for i in range(Xdim):\n", 203edab6123Sjeremylt " x[d*Xdim + i] = 1 if (i % (2**(dim-d))) // (2**(dim-d-1)) else -1\n", 204edab6123Sjeremylt "\n", 205edab6123Sjeremylt " X = ceed.Vector(Xdim*dim)\n", 206edab6123Sjeremylt " X.set_array(x, cmode=libceed.USE_POINTER)\n", 207edab6123Sjeremylt " Xq = ceed.Vector(Qdim*dim)\n", 208edab6123Sjeremylt " Xq.set_value(0)\n", 209edab6123Sjeremylt " U = ceed.Vector(Qdim)\n", 210edab6123Sjeremylt " U.set_value(0)\n", 211edab6123Sjeremylt " Uq = ceed.Vector(Qdim)\n", 212edab6123Sjeremylt "\n", 213edab6123Sjeremylt " bxl = ceed.BasisTensorH1Lagrange(dim, dim, 2, Q, libceed.GAUSS_LOBATTO)\n", 214edab6123Sjeremylt " bul = ceed.BasisTensorH1Lagrange(dim, 1, Q, Q, libceed.GAUSS_LOBATTO)\n", 215edab6123Sjeremylt "\n", 216edab6123Sjeremylt " bxl.apply(1, libceed.EVAL_INTERP, X, Xq)\n", 217edab6123Sjeremylt "\n", 218edab6123Sjeremylt " with Xq.array_read() as xq:\n", 219edab6123Sjeremylt " for i in range(Qdim):\n", 220edab6123Sjeremylt " xx = np.empty(dim, dtype=\"float64\")\n", 221edab6123Sjeremylt " for d in range(dim):\n", 222edab6123Sjeremylt " xx[d] = xq[d*Qdim + i]\n", 223edab6123Sjeremylt " uq[i] = eval(dim, xx)\n", 224edab6123Sjeremylt "\n", 225edab6123Sjeremylt " Uq.set_array(uq, cmode=libceed.USE_POINTER)\n", 226edab6123Sjeremylt "\n", 227edab6123Sjeremylt " # This operation is the identity because the quadrature is collocated\n", 228edab6123Sjeremylt " bul.T.apply(1, libceed.EVAL_INTERP, Uq, U)\n", 229edab6123Sjeremylt "\n", 230edab6123Sjeremylt " bxg = ceed.BasisTensorH1Lagrange(dim, dim, 2, Q, libceed.GAUSS)\n", 231edab6123Sjeremylt " bug = ceed.BasisTensorH1Lagrange(dim, 1, Q, Q, libceed.GAUSS)\n", 232edab6123Sjeremylt "\n", 233edab6123Sjeremylt " bxg.apply(1, libceed.EVAL_INTERP, X, Xq)\n", 234edab6123Sjeremylt " bug.apply(1, libceed.EVAL_INTERP, U, Uq)\n", 235edab6123Sjeremylt "\n", 236edab6123Sjeremylt " with Xq.array_read() as xq, Uq.array_read() as u:\n", 237edab6123Sjeremylt " #print('xq =', xq)\n", 238edab6123Sjeremylt " #print('u =', u)\n", 239edab6123Sjeremylt " if dim == 2:\n", 240edab6123Sjeremylt " # Default ordering is contiguous in x direction, but\n", 241edab6123Sjeremylt " # pyplot expects meshgrid convention, which is transposed.\n", 242edab6123Sjeremylt " x, y = xq.reshape(2, Q, Q).transpose(0, 2, 1)\n", 243edab6123Sjeremylt " plt.scatter(x, y, c=np.array(u).reshape(Q, Q))\n", 244edab6123Sjeremylt " plt.xlim(-1, 1)\n", 245edab6123Sjeremylt " plt.ylim(-1, 1)\n", 246edab6123Sjeremylt " plt.colorbar(label='u')" 247edab6123Sjeremylt ] 248edab6123Sjeremylt }, 249edab6123Sjeremylt { 250edab6123Sjeremylt "cell_type": "markdown", 251edab6123Sjeremylt "metadata": {}, 252edab6123Sjeremylt "source": [ 253edab6123Sjeremylt "* In the following example, we demonstrate the application of the gradient of the shape functions in multiple dimensions" 254edab6123Sjeremylt ] 255edab6123Sjeremylt }, 256edab6123Sjeremylt { 257edab6123Sjeremylt "cell_type": "code", 258edab6123Sjeremylt "execution_count": null, 259edab6123Sjeremylt "metadata": {}, 260edab6123Sjeremylt "outputs": [], 261edab6123Sjeremylt "source": [ 262edab6123Sjeremylt "for dim in range (1, 4):\n", 263edab6123Sjeremylt " P, Q = 8, 10\n", 264edab6123Sjeremylt " Pdim = P**dim\n", 265edab6123Sjeremylt " Qdim = Q**dim\n", 266edab6123Sjeremylt " Xdim = 2**dim\n", 267edab6123Sjeremylt " sum1 = sum2 = 0\n", 268edab6123Sjeremylt " x = np.empty(Xdim*dim, dtype=\"float64\")\n", 269edab6123Sjeremylt " u = np.empty(Pdim, dtype=\"float64\")\n", 270edab6123Sjeremylt "\n", 271edab6123Sjeremylt " for d in range(dim):\n", 272edab6123Sjeremylt " for i in range(Xdim):\n", 273edab6123Sjeremylt " x[d*Xdim + i] = 1 if (i % (2**(dim-d))) // (2**(dim-d-1)) else -1\n", 274edab6123Sjeremylt "\n", 275edab6123Sjeremylt " X = ceed.Vector(Xdim*dim)\n", 276edab6123Sjeremylt " X.set_array(x, cmode=libceed.USE_POINTER)\n", 277edab6123Sjeremylt " Xq = ceed.Vector(Pdim*dim)\n", 278edab6123Sjeremylt " Xq.set_value(0)\n", 279edab6123Sjeremylt " U = ceed.Vector(Pdim)\n", 280edab6123Sjeremylt " Uq = ceed.Vector(Qdim*dim)\n", 281edab6123Sjeremylt " Uq.set_value(0)\n", 282edab6123Sjeremylt " Ones = ceed.Vector(Qdim*dim)\n", 283edab6123Sjeremylt " Ones.set_value(1)\n", 284edab6123Sjeremylt " Gtposeones = ceed.Vector(Pdim)\n", 285edab6123Sjeremylt " Gtposeones.set_value(0)\n", 286edab6123Sjeremylt "\n", 287edab6123Sjeremylt " # Get function values at quadrature points\n", 288edab6123Sjeremylt " bxl = ceed.BasisTensorH1Lagrange(dim, dim, 2, P, libceed.GAUSS_LOBATTO)\n", 289edab6123Sjeremylt " bxl.apply(1, libceed.EVAL_INTERP, X, Xq)\n", 290edab6123Sjeremylt "\n", 291edab6123Sjeremylt " with Xq.array_read() as xq:\n", 292edab6123Sjeremylt " for i in range(Pdim):\n", 293edab6123Sjeremylt " xx = np.empty(dim, dtype=\"float64\")\n", 294edab6123Sjeremylt " for d in range(dim):\n", 295edab6123Sjeremylt " xx[d] = xq[d*Pdim + i]\n", 296edab6123Sjeremylt " u[i] = eval(dim, xx)\n", 297edab6123Sjeremylt "\n", 298edab6123Sjeremylt " U.set_array(u, cmode=libceed.USE_POINTER)\n", 299edab6123Sjeremylt "\n", 300edab6123Sjeremylt " # Calculate G u at quadrature points, G' * 1 at dofs\n", 301edab6123Sjeremylt " bug = ceed.BasisTensorH1Lagrange(dim, 1, P, Q, libceed.GAUSS)\n", 302edab6123Sjeremylt " bug.apply(1, libceed.EVAL_GRAD, U, Uq)\n", 303edab6123Sjeremylt " bug.T.apply(1, libceed.EVAL_GRAD, Ones, Gtposeones)\n", 304edab6123Sjeremylt "\n", 305edab6123Sjeremylt " # Check if 1' * G * u = u' * (G' * 1)\n", 306edab6123Sjeremylt " with Gtposeones.array_read() as gtposeones, Uq.array_read() as uq:\n", 307edab6123Sjeremylt " for i in range(Pdim):\n", 308edab6123Sjeremylt " sum1 += gtposeones[i]*u[i]\n", 309edab6123Sjeremylt " for i in range(dim*Qdim):\n", 310edab6123Sjeremylt " sum2 += uq[i]\n", 311edab6123Sjeremylt "\n", 312edab6123Sjeremylt " # Check that (1' * G * u - u' * (G' * 1)) is numerically zero\n", 313edab6123Sjeremylt " print('1T * G * u - uT * (GT * 1) =', np.abs(sum1 - sum2))" 314edab6123Sjeremylt ] 315edab6123Sjeremylt }, 316edab6123Sjeremylt { 317edab6123Sjeremylt "cell_type": "markdown", 318edab6123Sjeremylt "metadata": {}, 319edab6123Sjeremylt "source": [ 320edab6123Sjeremylt "### Advanced topics" 321edab6123Sjeremylt ] 322edab6123Sjeremylt }, 323edab6123Sjeremylt { 324edab6123Sjeremylt "cell_type": "markdown", 325edab6123Sjeremylt "metadata": {}, 326edab6123Sjeremylt "source": [ 327edab6123Sjeremylt "* In the following example, we demonstrate the QR factorization of a basis matrix.\n", 328edab6123Sjeremylt "The representation is similar to LAPACK's [`dgeqrf`](https://www.netlib.org/lapack/explore-html/dd/d9a/group__double_g_ecomputational_ga3766ea903391b5cf9008132f7440ec7b.html#ga3766ea903391b5cf9008132f7440ec7b), with elementary reflectors in the lower triangular block, scaled by `tau`." 329edab6123Sjeremylt ] 330edab6123Sjeremylt }, 331edab6123Sjeremylt { 332edab6123Sjeremylt "cell_type": "code", 333edab6123Sjeremylt "execution_count": null, 334edab6123Sjeremylt "metadata": {}, 335edab6123Sjeremylt "outputs": [], 336edab6123Sjeremylt "source": [ 337edab6123Sjeremylt "qr = np.array([1, -1, 4, 1, 4, -2, 1, 4, 2, 1, -1, 0], dtype=\"float64\")\n", 338edab6123Sjeremylt "tau = np.empty(3, dtype=\"float64\")\n", 339edab6123Sjeremylt "\n", 340edab6123Sjeremylt "qr, tau = ceed.qr_factorization(qr, tau, 4, 3)\n", 341edab6123Sjeremylt "\n", 342edab6123Sjeremylt "print('qr =')\n", 343edab6123Sjeremylt "print(qr.reshape(4, 3))\n", 344edab6123Sjeremylt "\n", 345edab6123Sjeremylt "print('tau =')\n", 346edab6123Sjeremylt "print(tau)" 347edab6123Sjeremylt ] 348edab6123Sjeremylt }, 349edab6123Sjeremylt { 350edab6123Sjeremylt "cell_type": "markdown", 351edab6123Sjeremylt "metadata": {}, 352edab6123Sjeremylt "source": [ 353edab6123Sjeremylt "* In the following example, we demonstrate the symmetric Schur decomposition of a basis matrix" 354edab6123Sjeremylt ] 355edab6123Sjeremylt }, 356edab6123Sjeremylt { 357edab6123Sjeremylt "cell_type": "code", 358edab6123Sjeremylt "execution_count": null, 359edab6123Sjeremylt "metadata": {}, 360edab6123Sjeremylt "outputs": [], 361edab6123Sjeremylt "source": [ 362edab6123Sjeremylt "A = np.array([0.19996678, 0.0745459, -0.07448852, 0.0332866,\n", 363edab6123Sjeremylt " 0.0745459, 1., 0.16666509, -0.07448852,\n", 364edab6123Sjeremylt " -0.07448852, 0.16666509, 1., 0.0745459,\n", 365edab6123Sjeremylt " 0.0332866, -0.07448852, 0.0745459, 0.19996678], dtype=\"float64\")\n", 366edab6123Sjeremylt "\n", 367edab6123Sjeremylt "lam = ceed.symmetric_schur_decomposition(A, 4)\n", 368edab6123Sjeremylt "\n", 369edab6123Sjeremylt "print(\"Q =\")\n", 370edab6123Sjeremylt "for i in range(4):\n", 371edab6123Sjeremylt " for j in range(4):\n", 372edab6123Sjeremylt " if A[j+4*i] <= 1E-14 and A[j+4*i] >= -1E-14:\n", 373edab6123Sjeremylt " A[j+4*i] = 0\n", 374edab6123Sjeremylt " print(\"%12.8f\"%A[j+4*i])\n", 375edab6123Sjeremylt "\n", 376edab6123Sjeremylt "print(\"lambda =\")\n", 377edab6123Sjeremylt "for i in range(4):\n", 378edab6123Sjeremylt " if lam[i] <= 1E-14 and lam[i] >= -1E-14:\n", 379edab6123Sjeremylt " lam[i] = 0\n", 380edab6123Sjeremylt " print(\"%12.8f\"%lam[i])" 381edab6123Sjeremylt ] 382edab6123Sjeremylt }, 383edab6123Sjeremylt { 384edab6123Sjeremylt "cell_type": "markdown", 385edab6123Sjeremylt "metadata": {}, 386edab6123Sjeremylt "source": [ 387edab6123Sjeremylt "* In the following example, we demonstrate the simultaneous diagonalization of a basis matrix" 388edab6123Sjeremylt ] 389edab6123Sjeremylt }, 390edab6123Sjeremylt { 391edab6123Sjeremylt "cell_type": "code", 392edab6123Sjeremylt "execution_count": null, 393edab6123Sjeremylt "metadata": {}, 394edab6123Sjeremylt "outputs": [], 395edab6123Sjeremylt "source": [ 396edab6123Sjeremylt "M = np.array([0.19996678, 0.0745459, -0.07448852, 0.0332866,\n", 397edab6123Sjeremylt " 0.0745459, 1., 0.16666509, -0.07448852,\n", 398edab6123Sjeremylt " -0.07448852, 0.16666509, 1., 0.0745459,\n", 399edab6123Sjeremylt " 0.0332866, -0.07448852, 0.0745459, 0.19996678], dtype=\"float64\")\n", 400edab6123Sjeremylt "K = np.array([3.03344425, -3.41501767, 0.49824435, -0.11667092,\n", 401edab6123Sjeremylt " -3.41501767, 5.83354662, -2.9167733, 0.49824435,\n", 402edab6123Sjeremylt " 0.49824435, -2.9167733, 5.83354662, -3.41501767,\n", 403edab6123Sjeremylt " -0.11667092, 0.49824435, -3.41501767, 3.03344425], dtype=\"float64\")\n", 404edab6123Sjeremylt "\n", 405edab6123Sjeremylt "x, lam = ceed.simultaneous_diagonalization(K, M, 4)\n", 406edab6123Sjeremylt "\n", 407edab6123Sjeremylt "print(\"x =\")\n", 408edab6123Sjeremylt "for i in range(4):\n", 409edab6123Sjeremylt " for j in range(4):\n", 410edab6123Sjeremylt " if x[j+4*i] <= 1E-14 and x[j+4*i] >= -1E-14:\n", 411edab6123Sjeremylt " x[j+4*i] = 0\n", 412edab6123Sjeremylt " print(\"%12.8f\"%x[j+4*i])\n", 413edab6123Sjeremylt "\n", 414edab6123Sjeremylt "print(\"lambda =\")\n", 415edab6123Sjeremylt "for i in range(4):\n", 416edab6123Sjeremylt " if lam[i] <= 1E-14 and lam[i] >= -1E-14:\n", 417edab6123Sjeremylt " lam[i] = 0\n", 418edab6123Sjeremylt " print(\"%12.8f\"%lam[i])" 419edab6123Sjeremylt ] 420edab6123Sjeremylt } 421edab6123Sjeremylt ], 422edab6123Sjeremylt "metadata": { 423edab6123Sjeremylt "kernelspec": { 424edab6123Sjeremylt "display_name": "Python 3", 425edab6123Sjeremylt "language": "python", 426edab6123Sjeremylt "name": "python3" 427edab6123Sjeremylt }, 428edab6123Sjeremylt "language_info": { 429edab6123Sjeremylt "codemirror_mode": { 430edab6123Sjeremylt "name": "ipython", 431edab6123Sjeremylt "version": 3 432edab6123Sjeremylt }, 433edab6123Sjeremylt "file_extension": ".py", 434edab6123Sjeremylt "mimetype": "text/x-python", 435edab6123Sjeremylt "name": "python", 436edab6123Sjeremylt "nbconvert_exporter": "python", 437edab6123Sjeremylt "pygments_lexer": "ipython3", 438edab6123Sjeremylt "version": "3.8.5" 439edab6123Sjeremylt } 440edab6123Sjeremylt }, 441edab6123Sjeremylt "nbformat": 4, 442edab6123Sjeremylt "nbformat_minor": 4 443edab6123Sjeremylt} 444