aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/SpectralSolver/SpectralFieldData.H
blob: a74bfe22b1b6e5f82f67679a2525b8bbf7a4ff78 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#ifndef WARPX_SPECTRAL_FIELD_DATA_H_
#define WARPX_SPECTRAL_FIELD_DATA_H_

#include <WarpX_Complex.H>
#include <SpectralKSpace.H>
#include <AMReX_MultiFab.H>

// Declare type for spectral fields
using SpectralField = amrex::FabArray< amrex::BaseFab <Complex> >;

/* Fields that will be stored in spectral space */
struct SpectralFieldIndex{
    enum { Ex=0, Ey, Ez, Bx, By, Bz, Jx, Jy, Jz, rho_old, rho_new };
};

/* \brief Class that stores the fields in spectral space
 *  and performs the spectral transforms to/from real space
 */
class SpectralFieldData
{
    friend class PsatdAlgorithm;

#ifdef AMREX_USE_GPU
// Add cuFFT-specific code
#else
    using FFTplans = amrex::LayoutData<fftw_plan>;
#endif

    public:
        SpectralFieldData( const amrex::BoxArray& realspace_ba,
                      const SpectralKSpace& k_space,
                      const amrex::DistributionMapping& dm );
        SpectralFieldData() = default; // Default constructor
        SpectralFieldData& operator=(SpectralFieldData&& field_data) = default; // Default move assignment
        ~SpectralFieldData();
        void ForwardTransform( const amrex::MultiFab& mf, const int field_index );
        void BackwardTransform( amrex::MultiFab& mf, const int field_index );

    private:
        SpectralField Ex, Ey, Ez, Bx, By, Bz, Jx, Jy, Jz, rho_old, rho_new;
        SpectralField tmpRealField, tmpSpectralField; // Store fields before/after transform
        FFTplans forward_plan, backward_plan;
        SpectralField& getSpectralField( const int field_index );
};

#endif // WARPX_SPECTRAL_FIELD_DATA_H_