Loading [MathJax]/extensions/tex2jax.js
ESPResSo
Extensible Simulation Package for Research on Soft Matter Systems
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
data_struct.hpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2010-2024 The ESPResSo project
3 * Copyright (C) 2002,2003,2004,2005,2006,2007,2008,2009,2010
4 * Max-Planck-Institute for Polymer Research, Theory Group
5 *
6 * This file is part of ESPResSo.
7 *
8 * ESPResSo is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * ESPResSo is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
24#include "config/config.hpp"
25
26#if defined(P3M) or defined(DP3M)
27
28#include "common.hpp"
29
30#include <array>
31#include <cassert>
32#include <memory>
33#include <tuple>
34#include <utility>
35#include <vector>
36
37/** @brief State of the p3m methods, the part which applies to both,
38 electrostatic and dipolar p3m */
39
40template <typename FloatType> struct P3MStateCommon {
41 using value_type = FloatType;
42
43 explicit P3MStateCommon(P3MParameters &&parameters)
44 : params{std::move(parameters)} {}
45
46 /** @brief P3M base parameters. */
48 /** @brief Local mesh geometry information for this MPI rank */
50
51 /**
52 * @brief Spatial differential operator in k-space.
53 * We use an i*k differentiation.
54 * TODO: RW: I think this is not the differential operator but the mapping
55 * between index in the GLOBAL mesh and the corresponding
56 * k-vector with a few pre-factors missing.
57 */
58 std::array<std::vector<int>, 3> d_op;
59
60 /** Calculate the Fourier transformed differential operator.
61 * Remark: This is done on the level of n-vectors and not k-vectors,
62 * i.e. the prefactor @f$ 2i\pi/L @f$ is missing!
63 */
67
68 /** @brief Force optimised influence function (k-space) */
69 std::vector<FloatType> g_force;
70 /** @brief Energy optimised influence function (k-space) */
71 std::vector<FloatType> g_energy;
72};
73
74template <typename FloatType> class FFTBackend;
75template <typename FloatType> class FFTBuffers;
76
77/**
78 * @brief LEGACY Base class for the electrostatics and magnetostatics P3M
79 * algorithms. Contains a handle to the FFT backend, information about the local
80 * mesh, the differential operator, and various buffers.
81 */
82template <typename FloatType>
83struct p3m_data_struct : public P3MStateCommon<FloatType> {
84 using value_type = FloatType;
85 using P3MStateCommon<FloatType>::P3MStateCommon;
86 using P3MStateCommon<FloatType>::local_mesh;
87
89
90 /** @brief FFT algorithm. */
91 std::unique_ptr<FFTBackend<FloatType>> fft;
92 /** @brief FFT buffers. */
93 std::unique_ptr<FFTBuffers<FloatType>> fft_buffers;
94
95 void init();
96
98 auto const mesh_size_ptr = fft->get_mesh_size();
99 auto const mesh_start_ptr = fft->get_mesh_start();
100 for (auto i = 0u; i < 3u; ++i) {
101 mesh.size[i] = mesh_size_ptr[i];
102 mesh.start[i] = mesh_start_ptr[i];
103 }
104 mesh.stop = mesh.start + mesh.size;
105 fft_buffers->update_mesh_views(mesh);
106 }
107
108 template <typename T, class... Args> void make_fft_instance(Args... args) {
109 assert(fft == nullptr);
110 fft = std::make_unique<T>(std::as_const(local_mesh), args...);
111 }
112
113 template <typename T, class... Args> void make_mesh_instance(Args... args) {
114 assert(fft_buffers == nullptr);
115 fft_buffers = std::make_unique<T>(std::as_const(local_mesh), args...);
116 }
117};
118
119/**
120 * @brief API for the FFT backend of the P3M algorithm.
121 */
122template <typename FloatType> class FFTBackend {
123protected:
125
126public:
130 virtual ~FFTBackend() = default;
131 virtual void init(P3MParameters const &params) = 0;
132 virtual int get_ca_mesh_size() const noexcept = 0;
133 virtual int get_ks_pnum() const noexcept = 0;
134 /** @brief Carry out the forward FFT of the scalar mesh. */
135 virtual void forward_fft(FloatType *rs_mesh) = 0;
136 /** @brief Carry out the backward FFT of the scalar mesh. */
137 virtual void backward_fft(FloatType *rs_mesh) = 0;
138 /** @brief Get indices of the k-space data layout. */
139 virtual std::tuple<int, int, int> get_permutations() const = 0;
140 virtual std::array<int, 3u> const &get_mesh_size() const = 0;
141 virtual std::array<int, 3u> const &get_mesh_start() const = 0;
142};
143
144/**
145 * @brief API for the FFT mesh buffers.
146 */
147template <typename FloatType> class FFTBuffers {
148protected:
150
151public:
155 virtual ~FFTBuffers() = default;
156 /** @brief Initialize the meshes. */
157 virtual void init_meshes(int ca_mesh_size) = 0;
158 /** @brief Initialize the halo buffers. */
159 virtual void init_halo() = 0;
160 /** @brief Update vector mesh halo with data from neighbors (accumulation). */
161 virtual void perform_vector_halo_gather() = 0;
162 /** @brief Update scalar mesh halo of all neighbors. */
163 virtual void perform_scalar_halo_spread() = 0;
164 /** @brief Update vector mesh halo of all neighbors. */
165 virtual void perform_vector_halo_spread() = 0;
166 /**
167 * @brief Get pointer to scalar mesh begin.
168 * Should only be used by @ref FFTBackend.
169 */
170 virtual FloatType *get_scalar_mesh() = 0;
171 /**
172 * @brief Get pointer to vector mesh begin.
173 * Should only be used by @ref FFTBackend.
174 */
175 virtual std::array<FloatType *, 3u> get_vector_mesh() = 0;
176 /**
177 * @brief Update the scalar and vector mesh views in @ref P3MFFTMesh
178 * to point to the new underlying data structures.
179 */
181};
182
183#endif // defined(P3M) or defined(DP3M)
API for the FFT backend of the P3M algorithm.
virtual void init(P3MParameters const &params)=0
virtual int get_ca_mesh_size() const noexcept=0
virtual ~FFTBackend()=default
virtual void backward_fft(FloatType *rs_mesh)=0
Carry out the backward FFT of the scalar mesh.
bool check_complex_residuals
virtual std::array< int, 3u > const & get_mesh_size() const =0
P3MLocalMesh const & local_mesh
virtual int get_ks_pnum() const noexcept=0
virtual void forward_fft(FloatType *rs_mesh)=0
Carry out the forward FFT of the scalar mesh.
virtual std::array< int, 3u > const & get_mesh_start() const =0
FFTBackend(P3MLocalMesh const &local_mesh)
virtual std::tuple< int, int, int > get_permutations() const =0
Get indices of the k-space data layout.
API for the FFT mesh buffers.
P3MLocalMesh const & local_mesh
virtual void init_meshes(int ca_mesh_size)=0
Initialize the meshes.
virtual void perform_vector_halo_gather()=0
Update vector mesh halo with data from neighbors (accumulation).
virtual std::array< FloatType *, 3u > get_vector_mesh()=0
Get pointer to vector mesh begin.
virtual void perform_vector_halo_spread()=0
Update vector mesh halo of all neighbors.
virtual void init_halo()=0
Initialize the halo buffers.
virtual void update_mesh_views(P3MFFTMesh< FloatType > &out)=0
Update the scalar and vector mesh views in P3MFFTMesh to point to the new underlying data structures.
FFTBuffers(P3MLocalMesh const &local_mesh)
virtual ~FFTBuffers()=default
virtual void perform_scalar_halo_spread()=0
Update scalar mesh halo of all neighbors.
virtual FloatType * get_scalar_mesh()=0
Get pointer to scalar mesh begin.
This file contains the defaults for ESPResSo.
Definition fft.cpp:74
Common functions for dipolar and charge P3M.
std::array< std::vector< int >, 3 > calc_p3m_mesh_shift(Utils::Vector3i const &mesh_size, bool zero_out_midpoint=false)
Calculate indices that shift P3MParameters::mesh by mesh/2.
static SteepestDescentParameters params
Currently active steepest descent instance.
Local mesh FFT buffers.
Properties of the local mesh.
Structure to hold P3M parameters and some dependent variables.
Utils::Vector3i mesh
number of mesh points per coordinate direction (>0), in real space.
State of the p3m methods, the part which applies to both, electrostatic and dipolar p3m.
std::vector< FloatType > g_energy
Energy optimised influence function (k-space)
std::vector< FloatType > g_force
Force optimised influence function (k-space)
P3MStateCommon(P3MParameters &&parameters)
std::array< std::vector< int >, 3 > d_op
Spatial differential operator in k-space.
FloatType value_type
void calc_differential_operator()
Calculate the Fourier transformed differential operator.
P3MParameters params
P3M base parameters.
P3MLocalMesh local_mesh
Local mesh geometry information for this MPI rank.
LEGACY Base class for the electrostatics and magnetostatics P3M algorithms.
std::unique_ptr< FFTBuffers< FloatType > > fft_buffers
FFT buffers.
void make_fft_instance(Args... args)
void update_mesh_views()
std::unique_ptr< FFTBackend< FloatType > > fft
FFT algorithm.
P3MFFTMesh< FloatType > mesh
FloatType value_type
void make_mesh_instance(Args... args)