Source code for felupe.quadrature._scheme
# -*- coding: utf-8 -*-
"""
This file is part of FElupe.
FElupe is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
FElupe is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with FElupe. If not, see <http://www.gnu.org/licenses/>.
"""
import numpy as np
[docs]
class Scheme:
r"""A quadrature scheme with integration points :math:`x_q` and weights :math:`w_q`.
It approximates the integral of a function over a region :math:`V` by a weighted sum
of function values :math:`f_q = f(x_q)`, evaluated on the quadrature-points.
Notes
-----
The approximation is given by
.. math::
\int_V f(x) dV \approx \sum f(x_q) w_q
with quadrature points :math:`x_q` and corresponding weights :math:`w_q`.
"""
def __init__(self, points, weights):
self.points = points
self.weights = weights
self.npoints, self.dim = self.points.shape
[docs]
def plot(self, plotter=None, point_size=20, weighted=False, **kwargs):
"""Plot the quadrature points, scaled by their weights, into a (optionally
provided) PyVista plotter.
See Also
--------
felupe.Scene.plot: Plot method of a scene.
"""
if plotter is None:
from ..mesh import Mesh
mesh = Mesh(self.points, np.zeros((0, 2), dtype=int), "line")
plotter = mesh.plot(**kwargs)
for weight, point in zip(self.weights, self.points):
# plotter requires 3d-point coordinates
points = np.pad([point], ((0, 0), (0, 3 - self.dim)))
if weighted:
point_weight = weight / self.weights.max()
else:
point_weight = 1.0
plotter.add_points(
points=points,
point_size=point_size * point_weight,
color="grey",
)
return plotter
[docs]
def screenshot(
self,
*args,
filename=None,
transparent_background=None,
scale=None,
**kwargs,
):
"""Take a screenshot of the quadrature.
See Also
--------
pyvista.Plotter.screenshot: Take a screenshot of a PyVista plotter.
"""
if filename is None:
filename = "quadrature.png"
return self.plot(*args, off_screen=True, **kwargs).screenshot(
filename=filename,
transparent_background=transparent_background,
scale=scale,
)