24 const ChargeAttrib& q_attrib,
28 policy_type iteration_policy,
29 typename Mesh::value_type dt)
31 using T =
typename Mesh::value_type;
32 constexpr unsigned Dim = Mesh::Dimension;
33 static_assert(Dim == 2 || Dim == 3,
34 "assemble_current_yee only supports 2D and 3D");
36 const auto origin = mesh.getOrigin();
37 const auto h = mesh.getMeshSpacing();
38 auto ldom = J_field.getLayout().getLocalNDIndex();
39 const int nghost = J_field.getNghost();
40 auto view = J_field.getView();
42 Kokkos::parallel_for(
"assemble_current_yee", iteration_policy,
43 KOKKOS_LAMBDA(
const std::size_t p) {
46 ::split(X0(p), X1(p), origin, h);
48 const T q_over_dt = q_attrib(p) / dt;
50 for (
unsigned i = 0; i < Dim + 1; ++i) {
51 const auto& seg = segs[i];
55 for (
unsigned d = 0; d < Dim; ++d) {
56 dp[d] = seg.p1[d] - seg.p0[d];
57 len_sq += dp[d] * dp[d];
59 if (len_sq == T(0))
continue;
62 for (
unsigned d = 0; d < Dim; ++d)
63 mid[d] = T(0.5) * (seg.p0[d] + seg.p1[d]);
65 Kokkos::Array<size_t, Dim> cellIdx;
66 for (
unsigned d = 0; d < Dim; ++d)
67 cellIdx[d] =
static_cast<size_t>((mid[d] - origin[d]) / h[d]);
69 Kokkos::Array<T, Dim> xi;
70 for (
unsigned d = 0; d < Dim; ++d)
71 xi[d] = (mid[d] - origin[d]) / h[d] - T(cellIdx[d]);
77 for (
unsigned c = 0; c < Dim; ++c) {
78 const T val_c = q_over_dt * dp[c];
80 for (
unsigned corner = 0; corner < (1u << (Dim - 1)); ++corner) {
84 for (
unsigned d = 0; d < Dim; ++d) {
86 idx[d] = cellIdx[d] - ldom.first()[d] + nghost;
88 const unsigned offset = (corner >> bit) & 1u;
89 weight *= offset ? xi[d] : (T(1) - xi[d]);
90 idx[d] = cellIdx[d] - ldom.first()[d] + nghost + offset;
95 Kokkos::atomic_add(&(
apply(view, idx)[c]), val_c * weight);
KOKKOS_INLINE_FUNCTION constexpr decltype(auto) apply(const View &view, const Coords &coords)
Definition IpplOperations.h:64
void assemble_current_yee(const Mesh &mesh, const ChargeAttrib &q_attrib, const PosAttrib &X0, const PosAttrib &X1, JField &J_field, policy_type iteration_policy, typename Mesh::value_type dt)
Deposit current density onto a Yee-staggered grid.
Definition CurrentDeposition.hpp:23