xref: /libCEED/examples/python/tutorial-1-vector.ipynb (revision edab612303ce5c583510db4ec9520fcda426d3c1)
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