10 using C = std::complex<T>;
14 for (
size_t i = 0; i < field.size(); ++i)
15 field_fft(i) = field(i);
17 FFT::forward(field_fft);
19 const T L = dx * field.size();
20 for (
size_t k = 0; k < field.size(); ++k) {
21 int n = (k <= field.size() / 2) ? k : (int)k - (
int)field.size();
22 C factor = C(0, 2.0 * M_PI * n / L);
23 field_fft(k) *= factor;
26 FFT::backward(field_fft);
27 for (
size_t i = 0; i < field.size(); ++i)
28 dfield(i) = field_fft(i).real();
35 using C = std::complex<T>;
39 const size_t NX = shape[0],
NY = shape[1],
NZ = shape[2];
44 for (
size_t i = 0; i <
NX; ++i)
45 for (
size_t j = 0;
j <
NY; ++
j)
46 for (
size_t k = 0;
k <
NZ; ++
k)
51 for (
size_t i = 0; i <
NX; ++i) {
55 for (
size_t j = 0;
j <
NY; ++
j) {
59 for (
size_t k = 0;
k <
NZ; ++
k) {
74 for (
int dim = 0; dim < 3; ++dim) {
77 for (
size_t i = 0; i <
NX; ++i)
78 for (
size_t j = 0;
j <
NY; ++
j)
79 for (
size_t k = 0;
k <
NZ; ++
k)
84 for (
size_t i = 0; i <
NX; ++i)
85 for (
size_t j = 0;
j <
NY; ++
j)
86 for (
size_t k = 0;
k <
NZ; ++
k)
91template <
typename T,
typename TensorFunc>
96 using C = std::complex<T>;
102 for (
size_t i = 0; i < 3; ++i) {
103 for (
size_t j = 0;
j < 3; ++
j) {
105 tensorium_RG::populate_tensor3D_component<T>(i,
j,
func, dx, dy, dz,
NX,
NY,
NZ);
110 for (
size_t k = 0;
k < 3; ++
k)
118template <
typename T,
typename ScalarFunc>
126 Xs(1) =
X(1) - 2 * dx;
132 Xs(1) =
X(1) + 2 * dx;
140 Xs(2) =
X(2) - 2 * dy;
146 Xs(2) =
X(2) + 2 * dy;
154 Xs(3) =
X(3) - 2 * dz;
160 Xs(3) =
X(3) + 2 * dz;
168template <
typename T,
typename VectorFunc>
176 Xs(1) =
X(1) - 2 * dx;
182 Xs(1) =
X(1) + 2 * dx;
184 for (
int i = 0; i < 3; ++i)
185 result(i, 0) = (-
Vp2(i) + 8 *
Vp1(i) - 8 *
Vm1(i) +
Vm2(i)) / (12 * dx);
191 Xs(2) =
X(2) - 2 * dy;
197 Xs(2) =
X(2) + 2 * dy;
199 for (
int i = 0; i < 3; ++i)
200 result(i, 1) = (-
Vp2(i) + 8 *
Vp1(i) - 8 *
Vm1(i) +
Vm2(i)) / (12 * dy);
206 Xs(3) =
X(3) - 2 * dz;
212 Xs(3) =
X(3) + 2 * dz;
214 for (
int i = 0; i < 3; ++i)
215 result(i, 2) = (-
Vp2(i) + 8 *
Vp1(i) - 8 *
Vm1(i) +
Vm2(i)) / (12 * dz);
220template <
typename T,
typename TensorFunc>
235 for (
size_t a = 0; a < 3; ++a) {
236 for (
size_t b = 0; b < 3; ++b) {
242 out(0, a, b) = (-
gp2(a, b) + 8 *
gp1(a, b) - 8 *
gm1(a, b) +
gm2(a, b)) / (12 * dx);
249 out(1, a, b) = (-
gp2(a, b) + 8 *
gp1(a, b) - 8 *
gm1(a, b) +
gm2(a, b)) / (12 * dy);
256 out(2, a, b) = (-
gp2(a, b) + 8 *
gp1(a, b) - 8 *
gm1(a, b) +
gm2(a, b)) / (12 * dz);
261template <
typename T,
typename TensorFunc>
276 for (
size_t a = 0; a < 3; ++a) {
277 for (
size_t b = 0; b < 3; ++b) {
285 (-
gp2(a, b) + 16 *
gp1(a, b) - 30 *
g0(a, b) + 16 *
gm1(a, b) -
gm2(a, b)) /
295 (-
gp2(a, b) + 16 *
gp1(a, b) - 30 *
g0(a, b) + 16 *
gm1(a, b) -
gm2(a, b)) /
305 (-
gp2(a, b) + 16 *
gp1(a, b) - 30 *
g0(a, b) + 16 *
gm1(a, b) -
gm2(a, b)) /
311template <
typename T,
typename VectorFunc>
326 for (
size_t i = 0; i < 3; ++i) {
347template <
typename T,
typename ScalarFunc>
390 for (
size_t i = 0; i < 3; ++i)
391 for (
size_t j = 0;
j < 3; ++
j) {
393 for (
size_t k = 0;
k < 3; ++
k)
402 size_t j,
size_t k,
T dx,
T dy,
T dz,
409 const size_t NX = shape[0],
NY = shape[1],
NZ = shape[2];
411 for (
size_t a = 0; a < 3; ++a) {
412 if (i >= 2 && i + 2 <
NX)
413 dvec_out(0, a) = (-get(i + 2,
j,
k, a) + 8 * get(i + 1,
j,
k, a) -
414 8 * get(i - 1,
j,
k, a) + get(i - 2,
j,
k, a)) /
416 else if (i > 0 && i + 1 <
NX)
417 dvec_out(0, a) = (get(i + 1,
j,
k, a) - get(i - 1,
j,
k, a)) / (2 * dx);
421 if (
j >= 2 &&
j + 2 <
NY)
422 dvec_out(1, a) = (-get(i,
j + 2,
k, a) + 8 * get(i,
j + 1,
k, a) -
423 8 * get(i,
j - 1,
k, a) + get(i,
j - 2,
k, a)) /
425 else if (
j > 0 &&
j + 1 <
NY)
426 dvec_out(1, a) = (get(i,
j + 1,
k, a) - get(i,
j - 1,
k, a)) / (2 * dy);
430 if (
k >= 2 &&
k + 2 <
NZ)
431 dvec_out(2, a) = (-get(i,
j,
k + 2, a) + 8 * get(i,
j,
k + 1, a) -
432 8 * get(i,
j,
k - 1, a) + get(i,
j,
k - 2, a)) /
434 else if (
k > 0 &&
k + 1 <
NZ)
435 dvec_out(2, a) = (get(i,
j,
k + 1, a) - get(i,
j,
k - 1, a)) / (2 * dz);
441template <
typename T,
typename ScalarFunc>
512template <
typename T,
typename ScalarFunc>
525 for (
int i = 0; i < 3; ++i)
526 for (
int j = 0;
j < 3; ++
j) {
527 result(i,
j) =
hess(i,
j);
528 for (
int k = 0;
k < 3; ++
k)
539 const size_t NX = shape[0],
NY = shape[1],
NZ = shape[2];
543 auto get = [&](
int i,
int j,
int k) ->
T {
559 for (
size_t i = 0; i <
NX; ++i) {
560 for (
size_t j = 0;
j <
NY; ++
j) {
561 for (
size_t k = 0;
k <
NZ; ++
k) {
563 auto d2f_xx = (-get(i + 2,
j,
k) + 16 * get(i + 1,
j,
k) - 30 * get(i,
j,
k) +
564 16 * get(i - 1,
j,
k) - get(i - 2,
j,
k)) /
566 auto d2f_yy = (-get(i,
j + 2,
k) + 16 * get(i,
j + 1,
k) - 30 * get(i,
j,
k) +
567 16 * get(i,
j - 1,
k) - get(i,
j - 2,
k)) /
569 auto d2f_zz = (-get(i,
j,
k + 2) + 16 * get(i,
j,
k + 1) - 30 * get(i,
j,
k) +
570 16 * get(i,
j,
k - 1) - get(i,
j,
k - 2)) /
573 auto d2f_xy = (get(i + 1,
j + 1,
k) - get(i + 1,
j - 1,
k) - get(i - 1,
j + 1,
k) +
574 get(i - 1,
j - 1,
k)) /
576 auto d2f_xz = (get(i + 1,
j,
k + 1) - get(i + 1,
j,
k - 1) - get(i - 1,
j,
k + 1) +
577 get(i - 1,
j,
k - 1)) /
579 auto d2f_yz = (get(i,
j + 1,
k + 1) - get(i,
j + 1,
k - 1) - get(i,
j - 1,
k + 1) +
580 get(i,
j - 1,
k - 1)) /
600 const size_t NX = shape[0],
NY = shape[1],
NZ = shape[2];
607 for (
size_t i = 0; i <
NX; ++i)
608 for (
size_t j = 0;
j <
NY; ++
j)
609 for (
size_t k = 0;
k <
NZ; ++
k) {
615 for (
int a = 0; a < 3; ++a)
616 for (
int b = 0; b < 3; ++b) {
618 for (
int c = 0;
c < 3; ++
c)
620 result(i,
j,
k, a, b) =
val;
627template <
typename T,
typename VectorFunc>
634 for (
int i = 0; i < 3; ++i)
635 for (
int j = 0;
j < 3; ++
j) {
636 result(i,
j) =
dVi(i,
j);
637 for (
int k = 0;
k < 3; ++
k)
644template <
typename T,
typename TensorFunc>
651 for (
int i = 0; i < 3; ++i)
652 for (
int j = 0;
j < 3; ++
j)
653 for (
int k = 0;
k < 3; ++
k) {
655 for (
int l = 0;
l < 3; ++
l)
662template <
typename T,
typename TensorFunc>
667 for (
int k = 0;
k < 3; ++
k) {
669 dx_vec(
k) = (
k == 0) ? dx : (
k == 1 ? dy : dz);
674 for (
int i = 0; i < 3; ++i)
675 for (
int j = 0;
j < 3; ++
j)
682template <
typename T,
typename TensorFunc>
691 for (
int i = 0; i < 3; ++i)
692 for (
int j = 0;
j < 3; ++
j)
693 for (
int k = 0;
k < 3; ++
k)
694 for (
int l = 0;
l < 3; ++
l) {
699 T h = (
j == 0) ? dx : (
j == 1 ? dy : dz);
static FrontendPluginRegistry::Add< TensoriumPluginAction > X("tensorium-dispatch", "Handle #pragma tensorium directives")
Register the plugin under the name "tensorium-dispatch".
Multi-dimensional tensor class with fixed rank and SIMD support.
Definition Tensor.hpp:25
void resize(const std::array< size_t, Rank > &dims)
Resize 2D tensor.
Definition Tensor.hpp:70
std::array< size_t, Rank > shape() const
Definition Tensor.hpp:62
Aligned, SIMD-optimized mathematical vector class for scientific computing.
Definition Vector.hpp:26
Definition BSSNAtildeTensor.hpp:10
tensorium::Tensor< T, 2 > compute_dt_gamma_from_beta(const tensorium::Tensor< T, 2 > &gamma, const tensorium::Vector< T > &beta, const tensorium::Tensor< T, 2 > &partial_beta, const tensorium::Tensor< T, 3 > &christoffel)
Definition BSSNDerivatives.hpp:384
tensorium::Tensor< T, 3 > spectral_partial_tensor2(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func, size_t NX, size_t NY, size_t NZ)
Definition BSSNDerivatives.hpp:92
void compute_second_derivatives_scalar3D(const tensorium::Tensor< T, 3 > &scalar_field, T dx, T dy, T dz, tensorium::Tensor< T, 5 > &hessian_out)
Definition BSSNDerivatives.hpp:536
tensorium::Tensor< T, 2 > partial_vector(const tensorium::Vector< T > &X, T dx, T dy, T dz, VectorFunc &&func)
Definition BSSNDerivatives.hpp:169
tensorium::Tensor< T, 2 > covariant_vector(const tensorium::Vector< T > &X, T dx, T dy, T dz, VectorFunc &&func, const tensorium::Tensor< T, 3 > &Gamma)
Definition BSSNDerivatives.hpp:628
void spectral_partial_scalar_3D(const tensorium::Tensor< T, 3 > &scalar_field, T dx, T dy, T dz, tensorium::Tensor< T, 4 > &grad_out)
Definition BSSNDerivatives.hpp:32
tensorium::Tensor< T, 2 > covariant_scalar_second(const tensorium::Vector< T > &X, T dx, T dy, T dz, ScalarFunc &&func, const tensorium::Tensor< T, 3 > &christoffel)
Definition BSSNDerivatives.hpp:513
void compute_partial_derivatives_vector(const tensorium::Vector< T > &X, T dx, T dy, T dz, VectorFunc &&func, tensorium::Tensor< T, 2 > &out)
Definition BSSNDerivatives.hpp:312
tensorium::Tensor< T, 3 > partial_tensor2(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func)
Definition BSSNDerivatives.hpp:663
tensorium::Vector< T > partial_scalar(const tensorium::Vector< T > &X, T dx, T dy, T dz, ScalarFunc &&func)
Definition BSSNDerivatives.hpp:119
void spectral_derivative_1D(tensorium::Vector< T > &field, tensorium::Vector< T > &dfield, T dx)
Definition BSSNDerivatives.hpp:9
void compute_partial_derivatives_vector3D(const tensorium::Tensor< T, 4 > &vec_field, size_t i, size_t j, size_t k, T dx, T dy, T dz, tensorium::Tensor< T, 2 > &dvec_out)
Definition BSSNDerivatives.hpp:401
tensorium::Tensor< T, 3 > covariant_tensor2(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func, const tensorium::Tensor< T, 3 > &Gamma)
Definition BSSNDerivatives.hpp:645
tensorium::Tensor< T, 5 > covariant_scalar_second_3D(const tensorium::Tensor< T, 3 > &chi, const tensorium::Tensor< T, 5 > &christoffel, T dx, T dy, T dz)
Definition BSSNDerivatives.hpp:596
tensorium::Tensor< T, 4 > covariant_tensor2_second(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func, const tensorium::Tensor< T, 3 > &Gamma)
Definition BSSNDerivatives.hpp:683
void compute_partial_derivatives_scalar(const tensorium::Vector< T > &X, T dx, T dy, T dz, ScalarFunc &&func, tensorium::Vector< T > &out)
Definition BSSNDerivatives.hpp:348
void compute_partial_derivatives_tensor2D(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func, tensorium::Tensor< T, 3 > &out)
Definition BSSNDerivatives.hpp:221
void compute_second_derivatives_tensor2D(const tensorium::Vector< T > &X, T dx, T dy, T dz, TensorFunc &&func, tensorium::Tensor< T, 4 > &out)
Definition BSSNDerivatives.hpp:262
void compute_second_derivatives_scalar(const tensorium::Vector< T > &X, T dx, T dy, T dz, ScalarFunc &&func, tensorium::Tensor< T, 2 > &out)
Definition BSSNDerivatives.hpp:442
Definition Derivate.hpp:24