xref: /libCEED/examples/python/tutorial-4-qfunction.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    "## 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