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