Peano
CurvilinearDerivatives.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../Numerics/idx.h"
4 
5 namespace 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)
j
Definition: euler.py:95