/* Copyright 2020 Remi Lehe * * This file is part of WarpX. * * License: BSD-3-Clause-LBNL */ #ifndef WARPX_FINITE_DIFFERENCE_SOLVER_H_ #define WARPX_FINITE_DIFFERENCE_SOLVER_H_ #include /** * \brief Top-level class for the electromagnetic finite-difference solver * * Stores the coefficients of the finite-difference stencils, * and has member functions to update fields over one time step. */ class FiniteDifferenceSolver { public: // Constructor FiniteDifferenceSolver ( int const fdtd_algo, std::array cell_size, bool const do_nodal ); void EvolveB ( std::array< std::unique_ptr, 3 >& Bfield, std::array< std::unique_ptr, 3 > const& Efield, amrex::Real const dt ); private: int m_fdtd_algo; bool m_do_nodal; #ifdef WARPX_DIM_RZ amrex::Real m_dr, m_rmin; amrex::Real m_nmodes; amrex::Gpu::ManagedVector m_stencil_coefs_r; amrex::Gpu::ManagedVector m_stencil_coefs_z; #else amrex::Gpu::ManagedVector m_stencil_coefs_x; amrex::Gpu::ManagedVector m_stencil_coefs_y; amrex::Gpu::ManagedVector m_stencil_coefs_z; #endif public: // The member functions below contain extended __device__ lambda. // In order to compile with nvcc, they need to be public. #ifdef WARPX_DIM_RZ template< typename T_Algo > void EvolveBCylindrical ( std::array< std::unique_ptr, 3 >& Bfield, std::array< std::unique_ptr, 3 > const& Efield, amrex::Real const dt ); #else template< typename T_Algo > void EvolveBCartesian ( std::array< std::unique_ptr, 3 >& Bfield, std::array< std::unique_ptr, 3 > const& Efield, amrex::Real const dt ); #endif }; #endif // WARPX_FINITE_DIFFERENCE_SOLVER_H_