aboutsummaryrefslogtreecommitdiff
path: root/Source/FieldSolver/SpectralSolver/SpectralSolverRZ.H
blob: e1179d9cf2e134ae92961ea3c39a4f4b5bef4860 (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Copyright 2019-2020 David Grote
 *
 * This file is part of WarpX.
 *
 * License: BSD-3-Clause-LBNL
 */
#ifndef WARPX_SPECTRAL_SOLVER_RZ_H_
#define WARPX_SPECTRAL_SOLVER_RZ_H_

#include "SpectralAlgorithms/SpectralBaseAlgorithmRZ.H"
#include "SpectralFieldDataRZ.H"

/* \brief Top-level class for the electromagnetic spectral solver
 *
 * Stores the field in spectral space, and has member functions
 * to Fourier-transform the fields between real space and spectral space
 * and to update fields in spectral space over one time step.
 */
class SpectralSolverRZ
{
    public:
        // Inline definition of the member functions of `SpectralSolverRZ`,
        // except the constructor (see `SpectralSolverRZ.cpp`)
        // The body of these functions is short, since the work is done in the
        // underlying classes `SpectralFieldData` and `PsatdAlgorithm`

        // Constructor
        SpectralSolverRZ(amrex::BoxArray const & realspace_ba,
                         amrex::DistributionMapping const & dm,
                         int const n_rz_azimuthal_modes,
                         int const norder_z, bool const nodal,
                         amrex::RealVect const dx, amrex::Real const dt,
                         int const lev,
                         bool const pml=false);

        /* \brief Transform the component `i_comp` of MultiFab `field_mf`
         *  to spectral space, and store the corresponding result internally
         *  (in the spectral field specified by `field_index`) */
        void ForwardTransform (amrex::MultiFab const & field_mf,
                               int const field_index,
                               int const i_comp=0 ) {
            BL_PROFILE("SpectralSolverRZ::ForwardTransform");
            field_data.ForwardTransform(field_mf, field_index, i_comp);
        };

        /* \brief Transform the two MultiFabs `field_mf1` and `field_mf2`
         *  to spectral space, and store the corresponding results internally
         *  (in the spectral field specified by `field_index1` and `field_index2`) */
        void ForwardTransform (amrex::MultiFab const & field_mf1, int const field_index1,
                               amrex::MultiFab const & field_mf2, int const field_index2) {
            BL_PROFILE("SpectralSolverRZ::ForwardTransform");
            field_data.ForwardTransform(field_mf1, field_index1,
                                        field_mf2, field_index2);
        };

        /* \brief Transform spectral field specified by `field_index` back to
         * real space, and store it in the component `i_comp` of `field_mf` */
        void BackwardTransform (amrex::MultiFab& field_mf,
                                int const field_index,
                                int const i_comp=0) {
            BL_PROFILE("SpectralSolverRZ::BackwardTransform");
            field_data.BackwardTransform(field_mf, field_index, i_comp);
        };

        /* \brief Transform spectral fields specified by `field_index1` and `field_index2`
         * back to real space, and store it in `field_mf1` and `field_mf2`*/
        void BackwardTransform (amrex::MultiFab& field_mf1, int const field_index1,
                                amrex::MultiFab& field_mf2, int const field_index2) {
            BL_PROFILE("SpectralSolverRZ::BackwardTransform");
            field_data.BackwardTransform(field_mf1, field_index1,
                                         field_mf2, field_index2);
        };

        /* \brief Update the fields in spectral space, over one timestep */
        void pushSpectralFields () {
            BL_PROFILE("SpectralSolverRZ::pushSpectralFields");
            // Virtual function: the actual function used here depends
            // on the sub-class of `SpectralBaseAlgorithm` that was
            // initialized in the constructor of `SpectralSolverRZ`
            algorithm->pushSpectralFields(field_data);
        };

        /**
          * \brief Public interface to call the member function ComputeSpectralDivE
          * of the base class SpectralBaseAlgorithmRZ from objects of class SpectralSolverRZ
          */
        void ComputeSpectralDivE ( const std::array<std::unique_ptr<amrex::MultiFab>,3>& Efield,
                                   amrex::MultiFab& divE ) {
            algorithm->ComputeSpectralDivE( field_data, Efield, divE );
        };

        /**
         * \brief Public interface to call the virtual function \c CurrentCorrection,
         * defined in the base class SpectralBaseAlgorithmRZ and possibly overridden
         * by its derived classes (e.g. PsatdAlgorithmRZ), from
         * objects of class SpectralSolverRZ through the private unique pointer \c algorithm
         *
         * \param[in,out] current two-dimensional array of unique pointers to MultiFab
         *                        storing the three components of the current density
         * \param[in]     rho     unique pointer to MultiFab storing the charge density
         */
        void CurrentCorrection ( std::array<std::unique_ptr<amrex::MultiFab>,3>& current,
                                 const std::unique_ptr<amrex::MultiFab>& rho ) {
             algorithm->CurrentCorrection( field_data, current, rho );
        };

        /**
         * \brief Public interface to call the virtual function \c VayDeposition,
         * declared in the base class SpectralBaseAlgorithmRZ and defined in its
         * derived classes, from objects of class SpectralSolverRZ through the private
         * unique pointer \c algorithm.
         *
         * \param[in,out] current Array of unique pointers to \c MultiFab storing
         *                        the three components of the current density
         */
        void VayDeposition (std::array<std::unique_ptr<amrex::MultiFab>,3>& current)
        {
            algorithm->VayDeposition(field_data, current);
        }

    private:

        SpectralFieldDataRZ field_data; // Store field in spectral space
                                        // and perform the Fourier transforms
        std::unique_ptr<SpectralBaseAlgorithmRZ> algorithm;
        // Defines field update equation in spectral space,
        // and the associated coefficients.
        // SpectralBaseAlgorithmRZ is a base class ; this pointer is meant
        // to point an instance of a *sub-class* defining a specific algorithm

};

#endif // WARPX_SPECTRAL_SOLVER_RZ_H_