Operators#
MOLE provides a comprehensive set of mimetic operators for numerical computations. These operators are designed to preserve important mathematical properties of the continuous operators they approximate.
Gradient Operator#
The Gradient operator computes the gradient of a scalar field in the MOLE library.
API Reference#
-
class Gradient : public sp_mat#
Mimetic Gradient operator.
Public Functions
-
Gradient(u16 k, u32 m, Real dx)#
1-D Mimetic Gradient Constructor
- Parameters:
k – Order of accuracy
m – Number of cells
dx – Spacing between cells
-
Gradient(u16 k, u32 m, u32 n, Real dx, Real dy)#
2-D Mimetic Gradient Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
-
Gradient(u16 k, u32 m, u32 n, u32 o, Real dx, Real dy, Real dz)#
3-D Mimetic Gradient Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
o – Number of cells in z-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
dz – Spacing between cells in z-direction
-
Gradient(u16 k, u32 m, Real dx)#
Divergence Operator#
The Divergence operator computes the divergence of a vector field in the MOLE library.
API Reference#
-
class Divergence : public sp_mat#
Mimetic Divergence operator.
Public Functions
-
Divergence(u16 k, u32 m, Real dx)#
1-D Mimetic Divergence Constructor
- Parameters:
k – Order of accuracy
m – Number of cells
dx – Spacing between cells
-
Divergence(u16 k, u32 m, u32 n, Real dx, Real dy)#
2-D Mimetic Divergence Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
-
Divergence(u16 k, u32 m, u32 n, u32 o, Real dx, Real dy, Real dz)#
3-D Mimetic Divergence Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
o – Number of cells in z-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
dz – Spacing between cells in z-direction
-
vec getQ()#
Returns the weights used in the Mimeitc Divergence Operators.
Note
for informational purposes only, can be used in constructing new operators.
-
Divergence(u16 k, u32 m, Real dx)#
Laplacian Operator#
The Laplacian operator computes the Laplacian of a scalar field in the MOLE library.
API Reference#
-
class Laplacian : public sp_mat#
Mimetic Laplacian operator.
Public Functions
-
Laplacian(u16 k, u32 m, Real dx)#
1-D Mimetic Laplacian Constructor
- Parameters:
k – Order of accuracy
m – Number of cells
dx – Spacing between cells
-
Laplacian(u16 k, u32 m, u32 n, Real dx, Real dy)#
2-D Mimetic Laplacian Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
-
Laplacian(u16 k, u32 m, u32 n, u32 o, Real dx, Real dy, Real dz)#
3-D Mimetic Laplacian Constructor
- Parameters:
k – Order of accuracy
m – Number of cells in x-direction
n – Number of cells in y-direction
o – Number of cells in z-direction
dx – Spacing between cells in x-direction
dy – Spacing between cells in y-direction
dz – Spacing between cells in z-direction
-
Laplacian(u16 k, u32 m, Real dx)#
Interpolation Operator#
The Interpol class performs interpolation operations in the MOLE library.
API Reference#
-
class Interpol : public sp_mat#
Mimetic Interpolator operator.
Public Functions
-
Interpol(u32 m, Real c)#
1-D Mimetic Interpolator Constructor
- Parameters:
m – Number of cells
c – Weight for ends, can be any value from 0.0<=c<=1.0
-
Interpol(u32 m, u32 n, Real c1, Real c2)#
2-D Mimetic Interpolator Constructor
- Parameters:
m – Number of cells in x-direction
n – Number of cells in y-direction
c1 – Weight for ends in x-direction, can be any value from 0.0<=c<=1.0
c2 – Weight for ends in y-direction, can be any value from 0.0<=c<=1.0
-
Interpol(u32 m, u32 n, u32 o, Real c1, Real c2, Real c3)#
3-D Mimetic Interpolator Constructor
- Parameters:
m – Number of cells in x-direction
n – Number of cells in y-direction
o – Number of cells in z-direction
c1 – Weight for ends in x-direction, can be any value from 0.0<=c<=1.0
c2 – Weight for ends in y-direction, can be any value from 0.0<=c<=1.0
c3 – Weight for ends in z-direction, can be any value from 0.0<=c<=1.0
-
Interpol(bool type, u32 m, Real c)#
1-D Mimetic Interpolator Constructor
- Parameters:
type – Dummy holder to trigger overloaded function
m – Number of cells
c – Weight for ends, can be any value from 0.0<=c<=1.0
-
Interpol(bool type, u32 m, u32 n, Real c1, Real c2)#
2-D Mimetic Interpolator Constructor
- Parameters:
type – Dummy holder to trigger overloaded function
m – Number of cells in x-direction
n – Number of cells in y-direction
c1 – Weight for ends in x-direction, can be any value from 0.0<=c<=1.0
c2 – Weight for ends in y-direction, can be any value from 0.0<=c<=1.0
-
Interpol(bool type, u32 m, u32 n, u32 o, Real c1, Real c2, Real c3)#
3-D Mimetic Interpolator Constructor
- Parameters:
type – Dummy holder to trigger overloaded function
m – Number of cells in x-direction
n – Number of cells in y-direction
o – Number of cells in z-direction
c1 – Weight for ends in x-direction, can be any value from 0.0<=c<=1.0
c2 – Weight for ends in y-direction, can be any value from 0.0<=c<=1.0
c3 – Weight for ends in z-direction, can be any value from 0.0<=c<=1.0
-
Interpol(u32 m, Real c)#
Usage Examples#
Transport Example (Gradient & Divergence)#
1/**
2 * This example uses MOLE to solve the 1D advection-reaction-dispersion
3 * equation:
4 * https://wwwbrr.cr.usgs.gov/projects/GWC_coupled/phreeqc/html/final-22.html
5 */
6
7#include "mole.h"
8#include <iostream>
9
10int main() {
11
12 int k = 2; // Operators' order of accuracy
13 Real a = 0; // Left boundary
14 Real b = 130; // Right boundary
15 int m = 26; // Number of cells
16 Real dx = (b - a) / m; // Cell's width [m]
17 Real t = 4; // Simulation time [years]
18 int iter = 208; // Number of iterations
19 Real dt = t / iter; // Time step
20 Real dis = 5; // Dispersivity [m]
21 Real vel = 15; // Pore-water flow velocity [m/year]
22 Real R = 2.5; // Retardation (Cl^- = 1, Na^+ = 2.5)
23 Real C0 = 1; // Displacing solution concentration [mmol/kgw]
24
25 // Get 1D mimetic operators
26 Gradient G(k, m, dx);
27 Divergence D(k, m, dx);
28 Interpol I(m, 0.5);
29
30 // Allocate fields
31 vec C(m + 2); // Scalar field (concentrations)
32 vec V(m + 1); // Vector field (velocities)
33
34 // Impose initial conditions
35 C(0) = C0;
36 V.fill(vel);
37
38 // Hydrodynamic dispersion coefficient [m^2/year]
39 dis *= vel; // 75
40
41 // dt = dt/R (retardation)
42 dt /= R;
43
44 // Time integration loop
45 for (int i = 0; i <= iter; i++) {
46
47 // First-order forward-time scheme
48 C += dt * (D * (dis * (G * C)) - D * (V % (I * C)));
49
50 // Right boundary condition (reflection)
51 C(m + 1) = C(m);
52 }
53
54 // Spit out the new concentrations!
55 cout << C;
56
57 return 0;
58}
Elliptic Example (Laplacian)#
1/**
2 * This example uses MOLE to solve a 2D BVP
3 * It is the equivalent to examples_MATLAB/minimal_poisson2D.m
4 * The output can be plotted via:
5 * gnuplot> plot 'solution' matrix with image
6 */
7
8#include "mole.h"
9#include <iostream>
10
11int main() {
12 int k = 2; // Operators' order of accuracy
13 int m = 9; // Vertical resolution
14 int n = 9; // Horizontal resolution
15
16 // Get mimetic operators
17 Laplacian L(k, m, n, 1, 1);
18 RobinBC BC(k, m, 1, n, 1, 1, 0); // Dirichlet BC
19 L = L + BC;
20
21 // Build RHS for system of equations
22 mat rhs(m + 2, n + 2, fill::zeros);
23 rhs.row(0) = 100 * ones(1, n + 2); // Known value at the bottom boundary
24
25 // Solve the system of linear equations
26#ifdef EIGEN
27 // Use Eigen only if SuperLU (faster) is not available
28 vec sol = Utils::spsolve_eigen(L, vectorise(rhs));
29#else
30 vec sol = spsolve(L, vectorise(rhs)); // Will use SuperLU
31#endif
32
33 // Print out the solution
34 cout << reshape(sol, m + 2, n + 2);
35
36 return 0;
37}
Schrödinger Example (Complex Operators)#
1/**
2 * This example uses MOLE to solve the 1D Schrodinger equation
3 */
4
5#include "mole.h"
6#include <algorithm>
7#include <iostream>
8
9int main() {
10
11 int k = 4; // Operators' order of accuracy
12 Real a = -5; // Left boundary
13 Real b = 5; // Right boundary
14 int m = 500; // Number of cells
15 vec grid = linspace(a, b, m);
16 Real dx = grid(1) - grid(0); // Step size
17
18 // Get mimetic Laplacian operator
19 Laplacian L(k, m - 2, dx);
20
21 std::transform(grid.begin(), grid.end(), grid.begin(),
22 [](Real x) { return x * x; });
23
24 sp_mat V(m, m); // Potential energy operator
25 V.diag(0) = grid;
26
27 // Hamiltonian
28 sp_mat H = -0.5 * (sp_mat)L + V;
29
30 cx_vec eigval;
31 eig_gen(eigval, (mat)H); // Compute eigenvalues
32
33 eigval = sort(eigval);
34
35 cout << "Energy levels = [ ";
36 for (int i = 0; i < 4; ++i)
37 cout << real(eigval(i) / eigval(0)) << ' ';
38 cout << "]\n";
39
40 return 0;
41}