22#include <gpu/FieldAccessor.h>
24#if defined(__CUDACC__)
34template <
typename FloatType>
36 if (x == 0 && y == 0 && z == 0)
38 auto constexpr two_pi = FloatType{2} * std::numbers::pi_v<FloatType>;
39 return FloatType(-0.5) /
40 FloatType(std::cos(two_pi * FloatType(x) / FloatType(dim[0])) +
41 std::cos(two_pi * FloatType(y) / FloatType(dim[1])) +
42 std::cos(two_pi * FloatType(z) / FloatType(dim[2])) - 3.) /
43 static_cast<FloatType
>(dim[0] * dim[1] * dim[2]);
46#if defined(__CUDACC__)
48template <
typename FloatType>
50create_greens_function(gpu::FieldAccessor<FloatType>
greens_function,
int x_min,
51 int y_min,
int z_min,
int x_max,
int y_max,
int z_max,
52 int global_dim_x,
int global_dim_y,
int global_dim_z) {
53 using RealType = std::conditional<std::is_same<FloatType, float>::value,
54 cufftReal, cufftDoubleReal>::type;
58 unsigned int local_dim[3] = {
static_cast<unsigned int>(x_max - x_min),
59 static_cast<unsigned int>(y_max - y_min),
60 static_cast<unsigned int>(z_max - z_min)};
61 unsigned int yz_slice_size = index / local_dim[0];
62 auto global_coord_x = x_min + index % local_dim[0];
63 auto global_coord_y = y_min + yz_slice_size % local_dim[1];
64 auto global_coord_z = z_min + yz_slice_size / local_dim[1];
65 constexpr RealType two_pi{2. * M_PI};
66 if (index < local_dim[0] * local_dim[1] * local_dim[2]) {
67 if (index == 0u and x_min == 0 and y_min == 0 and z_min == 0) {
73 (cos(two_pi *
static_cast<RealType
>(global_coord_x) /
74 static_cast<RealType
>(global_dim_x)) +
75 cos(two_pi *
static_cast<RealType
>(global_coord_y) /
76 static_cast<RealType
>(global_dim_y)) +
77 cos(two_pi *
static_cast<RealType
>(global_coord_z) /
78 static_cast<RealType
>(global_dim_z)) -
80 static_cast<RealType
>(global_dim_x * global_dim_y * global_dim_z);
85template <
typename FloatType,
typename ComplexType>
87multiply_by_greens_function(gpu::FieldAccessor<ComplexType>
potential,
98template <
typename FloatType>
99__global__
void add_fields_with_factor(gpu::FieldAccessor<FloatType> field_out,
100 gpu::FieldAccessor<FloatType> field_add,
101 FloatType
const factor) {
102 field_out.set(blockIdx, threadIdx);
103 field_add.set(blockIdx, threadIdx);
104 if (field_out.isValidPosition() && field_add.isValidPosition()) {
105 field_out.get(0u) += field_add.get(0u) * factor;
109template <
typename FloatType>
110__global__
void move_field(gpu::FieldAccessor<FloatType> dest_field,
111 gpu::FieldAccessor<FloatType> src_field) {
112 dest_field.set(blockIdx, threadIdx);
113 src_field.set(blockIdx, threadIdx);
114 if (dest_field.isValidPosition() && src_field.isValidPosition()) {
115 dest_field.get(0u) = src_field.get(0u);
116 src_field.get(0u) = FloatType{0};
\file PackInfoPdfDoublePrecision.cpp \author pystencils
FloatType greens_function(int x, int y, int z, auto const &dim)