Peano
Loading...
Searching...
No Matches
CurvilinearDerivatives.h
Go to the documentation of this file.
1#pragma once
2
3#include "../Numerics/idx.h"
4
5namespace ExaSeis {
6 template <class Shortcuts, typename T, int num_nodes, int numberOfData>
7 class Derivatives {
8 public:
9 static void metricDerivatives(
10 double dudx[][num_nodes], const T* const coordinates, const double* const dx, T* derivatives
11 ) {
12 T x_der_x, x_der_y, x_der_z;
13 T y_der_x, y_der_y, y_der_z;
14 T z_der_x, z_der_y, z_der_z;
15
16 kernels::idx4 id_der(num_nodes, num_nodes, num_nodes, 10);
17
18 for (int k = 0; k < num_nodes; k++) {
19 for (int j = 0; j < num_nodes; j++) {
20 for (int i = 0; i < num_nodes; i++) {
21
22 computeDerivatives_x_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 0, x_der_x, dx[0]);
23 computeDerivatives_y_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 0, x_der_y, dx[1]);
24 computeDerivatives_z_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 0, x_der_z, dx[2]);
25 computeDerivatives_x_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 1, y_der_x, dx[0]);
26 computeDerivatives_y_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 1, y_der_y, dx[1]);
27 computeDerivatives_z_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 1, y_der_z, dx[2]);
28 computeDerivatives_x_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 2, z_der_x, dx[0]);
29 computeDerivatives_y_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 2, z_der_y, dx[1]);
30 computeDerivatives_z_3D(dudx, k, j, i, coordinates, Shortcuts::curve_grid + 2, z_der_z, dx[2]);
31
32 T jacobian = x_der_x * (y_der_y * z_der_z - y_der_z * z_der_y)
33 - x_der_y * (y_der_x * z_der_z - y_der_z * z_der_x)
34 + x_der_z * (y_der_x * z_der_y - y_der_y * z_der_x);
35
36 derivatives[id_der(k, j, i, 0)] = jacobian;
37 derivatives[id_der(k, j, i, 1)] = (1.0 / jacobian) * (y_der_y * z_der_z - z_der_y * y_der_z);
38 derivatives[id_der(k, j, i, 4)] = (1.0 / jacobian) * (z_der_x * y_der_z - y_der_x * z_der_z);
39 derivatives[id_der(k, j, i, 7)] = (1.0 / jacobian) * (y_der_x * z_der_y - z_der_x * y_der_y);
40
41 derivatives[id_der(k, j, i, 2)] = (1.0 / jacobian) * (z_der_y * x_der_z - x_der_y * z_der_z);
42 derivatives[id_der(k, j, i, 5)] = (1.0 / jacobian) * (x_der_x * z_der_z - z_der_x * x_der_z);
43 derivatives[id_der(k, j, i, 8)] = (1.0 / jacobian) * (z_der_x * x_der_y - x_der_x * z_der_y);
44
45 derivatives[id_der(k, j, i, 3)] = (1.0 / jacobian) * (x_der_y * y_der_z - y_der_y * x_der_z);
46 derivatives[id_der(k, j, i, 6)] = (1.0 / jacobian) * (y_der_x * x_der_z - x_der_x * y_der_z);
47 derivatives[id_der(k, j, i, 9)] = (1.0 / jacobian) * (x_der_x * y_der_y - y_der_x * x_der_y);
48 }
49 }
50 }
51 }
52
53 private:
55 double dudx[][num_nodes], int k, int j, int i, const T* values, int coordinate, T& der_x, const double dx
56 ) {
57
58 kernels::idx4 id_xyz(num_nodes, num_nodes, num_nodes, numberOfData);
59 der_x = 0.0;
60 for (int n = 0; n < num_nodes; n++) {
61 der_x += dudx[i][n] * values[id_xyz(k, j, n, coordinate)] / dx;
62 }
63 }
64
66 double dudx[][num_nodes], int k, int j, int i, const T* values, int coordinate, T& der_y, const double dy
67 ) {
68
69 kernels::idx4 id_xyz(num_nodes, num_nodes, num_nodes, numberOfData);
70 der_y = 0.0;
71 for (int n = 0; n < num_nodes; n++) {
72 der_y += dudx[j][n] * values[id_xyz(k, n, i, coordinate)] / dy;
73 }
74 }
75
77 double dudx[][num_nodes], int k, int j, int i, const T* values, int coordinate, T& der_z, const double dz
78 ) {
79
80 kernels::idx4 id_xyz(num_nodes, num_nodes, num_nodes, numberOfData);
81
82 der_z = 0.0;
83 for (int n = 0; n < num_nodes; n++) {
84 der_z += dudx[k][n] * values[id_xyz(n, j, i, coordinate)] / dz;
85 }
86 }
87 };
88} // namespace ExaSeis
static void computeDerivatives_y_3D(double dudx[][num_nodes], int k, int j, int i, const T *values, int coordinate, T &der_y, const double dy)
static void computeDerivatives_z_3D(double dudx[][num_nodes], int k, int j, int i, const T *values, int coordinate, T &der_z, const double dz)
static void computeDerivatives_x_3D(double dudx[][num_nodes], int k, int j, int i, const T *values, int coordinate, T &der_x, const double dx)
static void metricDerivatives(double dudx[][num_nodes], const T *const coordinates, const double *const dx, T *derivatives)