WarpX
SpectralBaseAlgorithm.H
Go to the documentation of this file.
1 /* Copyright 2019 Remi Lehe, Edoardo Zoni
2  *
3  * This file is part of WarpX.
4  *
5  * License: BSD-3-Clause-LBNL
6  */
7 #ifndef WARPX_SPECTRAL_BASE_ALGORITHM_H_
8 #define WARPX_SPECTRAL_BASE_ALGORITHM_H_
9 
11 #include "Utils/WarpX_Complex.H"
12 
15 
16 #include <ablastr/utils/Enums.H>
17 
18 #include <AMReX_BaseFab.H>
19 #include <AMReX_Config.H>
20 #include <AMReX_FabArray.H>
21 #include <AMReX_REAL.H>
22 
23 #include <AMReX_BaseFwd.H>
24 
25 #include <array>
26 #include <memory>
27 
28 #if WARPX_USE_FFT
29 
30 /* \brief Class that updates the field in spectral space
31  * and stores the coefficients of the corresponding update equation.
32  *
33  * `SpectralBaseAlgorithm` is only a base class and cannot be used directly.
34  * Instead use its subclasses, which implement the specific field update
35  * equations for a given spectral algorithm.
36  */
38 {
39  public:
40  // Virtual member function ; meant to be overridden in subclasses
41  virtual void pushSpectralFields(SpectralFieldData& f) const = 0;
42 
43  // The destructor should also be a virtual function, so that
44  // a pointer to subclass of `SpectraBaseAlgorithm` actually
45  // calls the subclass's destructor.
46  virtual ~SpectralBaseAlgorithm() = default;
47 
48  // Default move and copy operations
53 
61  virtual void CurrentCorrection (SpectralFieldData& field_data) = 0;
62 
70  virtual void VayDeposition (SpectralFieldData& field_data) = 0;
71 
75  void ComputeSpectralDivE ( int lev,
76  SpectralFieldData& field_data,
77  const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
78  amrex::MultiFab& divE );
79 
80  protected: // Meant to be used in the subclasses
81 
83  amrex::FabArray< amrex::BaseFab <amrex::Real> >;
85  amrex::FabArray< amrex::BaseFab <Complex> >;
86 
90  SpectralBaseAlgorithm(const SpectralKSpace& spectral_kspace,
92  const SpectralFieldIndex& spectral_index,
93  int norder_x,
94  int norder_y,
95  int norder_z,
97 
99 
100  // Modified finite-order vectors
102 #if defined(WARPX_DIM_3D)
103  KVectorComponent modified_ky_vec;
104 #endif
106 };
107 
108 #endif // WARPX_USE_FFT
109 #endif // WARPX_SPECTRAL_BASE_ALGORITHM_H_
Definition: SpectralBaseAlgorithm.H:38
KVectorComponent modified_kz_vec
Definition: SpectralBaseAlgorithm.H:105
virtual void pushSpectralFields(SpectralFieldData &f) const =0
SpectralFieldIndex m_spectral_index
Definition: SpectralBaseAlgorithm.H:98
SpectralBaseAlgorithm(SpectralBaseAlgorithm &&)=default
KVectorComponent modified_kx_vec
Definition: SpectralBaseAlgorithm.H:101
SpectralBaseAlgorithm & operator=(const SpectralBaseAlgorithm &)=default
virtual void VayDeposition(SpectralFieldData &field_data)=0
Virtual function for Vay current deposition in Fourier space (Vay et al, 2013). This virtual function...
void ComputeSpectralDivE(int lev, SpectralFieldData &field_data, const std::array< std::unique_ptr< amrex::MultiFab >, 3 > &Efield, amrex::MultiFab &divE)
Compute spectral divergence of E.
Definition: SpectralBaseAlgorithm.cpp:58
SpectralBaseAlgorithm & operator=(SpectralBaseAlgorithm &&)=default
virtual void CurrentCorrection(SpectralFieldData &field_data)=0
Virtual function for current correction in Fourier space (Vay et al, 2013). This virtual function is ...
virtual ~SpectralBaseAlgorithm()=default
SpectralBaseAlgorithm(const SpectralBaseAlgorithm &)=default
Class that stores the fields in spectral space, and performs the Fourier transforms between real spac...
Definition: SpectralFieldData.H:143
Definition: SpectralFieldData.H:34
Class that represents the spectral space.
Definition: SpectralKSpace.H:50
GridType
Definition: Enums.H:17