8 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
22 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
35 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
38 typename SourceField::BConds_t vector_bcs;
39 auto bcsetter_single = [&vector_bcs]<
size_t Idx>(
const std::index_sequence<Idx>&) {
40 vector_bcs[Idx] = std::make_shared<ippl::PeriodicFace<SourceField>>(Idx);
43 auto bcsetter = [bcsetter_single]<
size_t... Idx>(
const std::index_sequence<Idx...>&) {
44 int x = (bcsetter_single(std::index_sequence<Idx>{}) ^ ...);
47 bcsetter(std::make_index_sequence<Dim * 2>{});
48 A_n.setFieldBC(vector_bcs);
49 A_np1.setFieldBC(vector_bcs);
50 A_nm1.setFieldBC(vector_bcs);
59 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
62 Kokkos::deep_copy(this->A_nm1.getView(), this->A_n.getView());
63 Kokkos::deep_copy(this->A_n.getView(), this->A_np1.getView());
71 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
73 if constexpr (boundary_conditions == periodic) {
74 A_n.getFieldBC().apply(A_n);
75 A_nm1.getFieldBC().apply(A_nm1);
76 A_np1.getFieldBC().apply(A_np1);
79 true_nr += (A_n.getNghost() * 2);
81 bcs.
apply(A_n, A_nm1, A_np1, this->dt, true_nr, layout_mp->getLocalNDIndex());
91 template <
typename EMField,
typename SourceField, fdtd_bc boundary_conditions>
96 const scalar idt = scalar(1.0) / dt;
97 auto A_np1 = this->A_np1.getView(), A_n = this->A_n.getView(),
98 A_nm1 = this->A_nm1.getView();
106 Kokkos::parallel_for(
107 this->A_n.getFieldRangePolicy(), KOKKOS_LAMBDA(
size_t i,
size_t j,
size_t k) {
109 dAdt[0] = (A_n(i, j, k)[1] - A_nm1(i, j, k)[1]) * idt;
110 dAdt[1] = (A_n(i, j, k)[2] - A_nm1(i, j, k)[2]) * idt;
111 dAdt[2] = (A_n(i, j, k)[3] - A_nm1(i, j, k)[3]) * idt;
114 (A_n(i + 1, j, k) - A_n(i - 1, j, k)) * inverse_2_spacing[0];
116 (A_n(i, j + 1, k) - A_n(i, j - 1, k)) * inverse_2_spacing[1];
118 (A_n(i, j, k + 1) - A_n(i, j, k - 1)) * inverse_2_spacing[2];
126 Eview(i, j, k) = -dAdt - grad_phi;
127 Bview(i, j, k) = curlA;
void evaluate_EB()
Evaluates the electric and magnetic fields.
Definition FDTDSolverBase.hpp:92
void applyBCs()
Applies the boundary conditions.
Definition FDTDSolverBase.hpp:72
void setPeriodicBoundaryConditions()
Sets periodic boundary conditions.
Definition FDTDSolverBase.hpp:37
void solve() override
Solves the FDTD equations.
Definition FDTDSolverBase.hpp:23
void timeShift()
Shifts the saved fields in time.
Definition FDTDSolverBase.hpp:60
FDTDSolverBase(SourceField &source, EMField &E, EMField &B)
Constructor for the FDTDSolverBase class.
Definition FDTDSolverBase.hpp:9
void setEMFields(EMField &E, EMField &B)
Definition Maxwell.h:52
virtual void setSources(SourceField &four_current)
Definition Maxwell.h:45
Definition AbsorbingBC.h:407
void apply(field_type &FA_n, field_type &FA_nm1, field_type &FA_np1, dt_type dt, ippl::Vector< uint32_t, 3 > true_nr, ippl::NDIndex< 3 > lDom)
Applies second-order Mur ABC to the boundaries of the field.
Definition AbsorbingBC.h:418