v0.14.0
Loading...
Searching...
No Matches
diffusion_Tensor1.hpp
Go to the documentation of this file.
1/* Computes 2*del^2 of a Tensor1_ptr but uses diagonal derivatives for
2 half of it. Yields a Tensor1. */
3
4#pragma once
5
6namespace FTensor
7{
8 template <class T, int Dim, char i> class diffusion_Tensor1
9 {
11 const int di, dj, dk;
12 const double dx;
13
14 public:
15 typename promote<T, double>::V operator()(const int N1) const
16 {
17 return ((*(a.ptr(N1) + di) - 2 * a(N1) + *(a.ptr(N1) - di))
18 + (*(a.ptr(N1) + dj) - 2 * a(N1) + *(a.ptr(N1) - dj))
19 + (*(a.ptr(N1) + dk) - 2 * a(N1) + *(a.ptr(N1) - dk))
20 + ((*(a.ptr(N1) + di + dj) + *(a.ptr(N1) + di - dj)
21 + *(a.ptr(N1) - di + dj) + *(a.ptr(N1) - di - dj)
22 - 4 * a(N1))
23 + (*(a.ptr(N1) + di + dk) + *(a.ptr(N1) + di - dk)
24 + *(a.ptr(N1) - di + dk) + *(a.ptr(N1) - di - dk)
25 - 4 * a(N1))
26 + (*(a.ptr(N1) + dj + dk) + *(a.ptr(N1) + dj - dk)
27 + *(a.ptr(N1) - dj + dk) + *(a.ptr(N1) - dj - dk)
28 - 4 * a(N1)))
29 / (std::sqrt(2.0)))
30 * dx * dx;
31 }
32 diffusion_Tensor1(const Tensor1<T *, Dim> &A, const int Di, const int Dj,
33 const int Dk, const double Dx)
34 : a(A), di(Di), dj(Dj), dk(Dk), dx(Dx)
35 {}
36 };
37
38 template <class T, int Dim, char i>
40 typename promote<T, double>::V, Dim, i>
42 const int &di, const int &dj, const int &dk, const double &dx)
43 {
44 using Tensor_Expr = diffusion_Tensor1<T, Dim, i>;
46 Tensor_Expr(a, di, dj, dk, dx));
47 }
48}
constexpr double a
promote< T, double >::V operator()(const int N1) const
const Tensor1< T *, Dim > & a
diffusion_Tensor1(const Tensor1< T *, Dim > &A, const int Di, const int Dj, const int Dk, const double Dx)
FTensor::Index< 'i', SPACE_DIM > i
Tensors class implemented by Walter Landry.
Definition FTensor.hpp:51
promote< T, double >::V diffusion(const Tensor0< T * > &a, const int &di, const int &dj, const int &dk, const double &dx)