Developer Tutorials
=====================
Session 0: C++ Essentials
---------------------------
.. raw:: html
:download:`Slides `
`Exercise solution `_
Errata:
* Slide 8: "macro" should be "directive." A directive is the command; a macro is a definition (e.g., a variable) stored by the preprocessor.
Session 1: Advanced C++
---------------------------
.. raw:: html
:download:`Slides `
`Exercise solution `_
Session 2: Kokkos
---------------------------
.. raw:: html
:download:`Slides `
`Exercise solution `_
Session 3: MPI
---------------------------
.. raw:: html
:download:`Slides `
`Exercise solution `_
Session 4: Hands-On PIC Exercise
---------------------------------
You must be logged in to UIUC MediaSpace
and a member of the LCPP channel to view this video.
.. raw:: html
Session 5: hPIC2 Class Hierarchy
---------------------------------
You must be logged in to UIUC MediaSpace
and a member of the LCPP channel to view this video.
The session slides are an attachment to the video on MediaSpace.
.. raw:: html
Session 6: hPIC2 Code Example Walkthrough Pt. 1
--------------------------------------------------
You must be logged in to UIUC MediaSpace
and a member of the LCPP channel to view this video.
.. raw:: html
Session 7: hPIC2 Code Example Walkthrough Pt. 2
--------------------------------------------------
You must be logged in to UIUC MediaSpace
and a member of the LCPP channel to view this video.
.. raw:: html
Session 8: Finite Element Methods
------------------------------------------------
You must be logged in to UIUC MediaSpace
and a member of the LCPP channel to view this video.
The session slides are an attachment to the video on MediaSpace.
.. raw:: html
.. raw:: html
Exercise solutions
#. Given a test function :math:`\psi`, the weak form is
.. math::
- \int_\Omega \sigma \nabla u \cdot \nabla \psi \, \mathrm{d} \mathbf{x} + \int_{\partial \Omega} \psi \sigma \nabla u \cdot \hat{\mathbf{n}} \, \mathrm{d} S + k^2 \int_\Omega u \psi \, \mathrm{d} \mathbf{x} = \int_\Omega f \psi \, \mathrm{d} \mathbf{x}.
#. From the weak form, it can be seen that natural boundary conditions have the form
.. math::
\sigma \nabla u \cdot \hat{\mathbf{n}} = g,
for some known function :math:`g`.
This differs from the isotropic Poisson's equation in that
we have an extra factor of :math:`\sigma` in the boundary condition;
i.e., the natural boundary conditions are not purely Neumann.
#. With a bilinear form of
.. math::
a(u, v) = -\int_\Omega \sigma \nabla u \cdot \nabla v \, \mathrm{d} \mathbf{x} + k^2 \int_\Omega u v \, \mathrm{d} \mathbf{x},
and a linear form of
.. math::
\langle l, u \rangle = \int_\Omega f u \, \mathrm{d} \mathbf{x} - \int_{\partial \Omega} g u \, \mathrm{d} S,
where :math:`g` corresponds to a natural boundary condition,
the weak form can be written as
.. math::
a(u, \psi) = \langle l, \psi \rangle.
Note that this bilinear form is actually only truly bilinear if
:math:`\sigma` is a constant matrix.
Otherwise, it is called a **nonlinear form**.
.. raw:: html