Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/archetypes/tests/pgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ struct ExtForce {
Inline auto fx1(spidx_t, simtime_t, const coord_t<D>&) const -> real_t {
return ZERO;
}

Inline auto ex1(spidx_t, simtime_t, const coord_t<D>&) const -> real_t {
return ZERO;
}

Inline auto bx3(spidx_t, simtime_t, const coord_t<D>&) const -> real_t {
return ZERO;
}
};

template <Dimension D>
Expand Down Expand Up @@ -142,6 +150,22 @@ auto main(int argc, char* argv[]) -> int {
Domain<SimEngine::SRPIC, metric::Minkowski<Dim::_1D>>>) {
throw std::runtime_error("CustomPgen should have CustomStat");
}
if constexpr (
not ::traits::external::HasFx1<decltype(custom_pgen.ext_fields), Dim::_1D>) {
throw std::runtime_error("CustomPgen's ext_fields should have fx1");
}
if constexpr (
not ::traits::external::HasEx1<decltype(custom_pgen.ext_fields), Dim::_1D>) {
throw std::runtime_error("CustomPgen's ext_fields should have ex1");
}
if constexpr (
::traits::external::HasBx1<decltype(custom_pgen.ext_fields), Dim::_1D>) {
throw std::runtime_error("CustomPgen's ext_fields should not have bx1");
}
if constexpr (
not ::traits::external::HasBx3<decltype(custom_pgen.ext_fields), Dim::_1D>) {
throw std::runtime_error("CustomPgen's ext_current should have bx3");
}

} catch (std::exception& e) {
std::cerr << e.what() << std::endl;
Expand Down
67 changes: 54 additions & 13 deletions src/kernels/particle_pusher_sr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,19 +311,9 @@ namespace kernel::sr {

metric.template transform_xyz<Idx::U, Idx::XYZ>(xp_Cd, ei, ei_Cart);
metric.template transform_xyz<Idx::U, Idx::XYZ>(xp_Cd, bi, bi_Cart);
if ((radiative_drag_flags != RadiativeDrag::NONE) or HasEmission) {
// backup fields & velocities to use later in radiative drag
ei_Cart_rad[0] = ei_Cart[0];
ei_Cart_rad[1] = ei_Cart[1];
ei_Cart_rad[2] = ei_Cart[2];
bi_Cart_rad[0] = bi_Cart[0];
bi_Cart_rad[1] = bi_Cart[1];
bi_Cart_rad[2] = bi_Cart[2];
u_prime[0] = ux1(p);
u_prime[1] = ux2(p);
u_prime[2] = ux3(p);
}

coord_t<M::PrtlDim> xp_Ph { ZERO };

if constexpr (HasExtForce or Atm or HasExtEfield or HasExtBfield or
HasEmission) {
if constexpr (M::PrtlDim == Dim::_1D or M::PrtlDim == Dim::_2D or
Expand All @@ -337,6 +327,58 @@ namespace kernel::sr {
xp_Ph[2] = metric.template convert<3, Crd::Cd, Crd::Ph>(xp_Cd[2]);
}
}

// add the user-provided external fields
if constexpr (HasExtEfield) {
vec_t<Dim::_3D> ext_e_Ph { ZERO };
vec_t<Dim::_3D> ext_e_Cart { ZERO };
if constexpr (::traits::external::HasEx1<F, D>) {
ext_e_Ph[0] = external_fields.ex1(sp, time, xp_Ph);
}
if constexpr (::traits::external::HasEx2<F, D>) {
ext_e_Ph[1] = external_fields.ex2(sp, time, xp_Ph);
}
if constexpr (::traits::external::HasEx3<F, D>) {
ext_e_Ph[2] = external_fields.ex3(sp, time, xp_Ph);
}
metric.template transform_xyz<Idx::T, Idx::XYZ>(xp_Cd, ext_e_Ph, ext_e_Cart);
ei_Cart[0] += ext_e_Cart[0];
ei_Cart[1] += ext_e_Cart[1];
ei_Cart[2] += ext_e_Cart[2];
}

if constexpr (HasExtBfield) {
vec_t<Dim::_3D> ext_b_Ph { ZERO };
vec_t<Dim::_3D> ext_b_Cart { ZERO };
if constexpr (::traits::external::HasEx1<F, D>) {
ext_b_Ph[0] = external_fields.bx1(sp, time, xp_Ph);
}
if constexpr (::traits::external::HasEx2<F, D>) {
ext_b_Ph[1] = external_fields.bx2(sp, time, xp_Ph);
}
if constexpr (::traits::external::HasEx3<F, D>) {
ext_b_Ph[2] = external_fields.bx3(sp, time, xp_Ph);
}
metric.template transform_xyz<Idx::T, Idx::XYZ>(xp_Cd, ext_b_Ph, ext_b_Cart);
bi_Cart[0] += ext_b_Cart[0];
bi_Cart[1] += ext_b_Cart[1];
bi_Cart[2] += ext_b_Cart[2];
}

// backup fields & velocities to use later in radiative drag
if ((radiative_drag_flags != RadiativeDrag::NONE) or HasEmission) {
ei_Cart_rad[0] = ei_Cart[0];
ei_Cart_rad[1] = ei_Cart[1];
ei_Cart_rad[2] = ei_Cart[2];
bi_Cart_rad[0] = bi_Cart[0];
bi_Cart_rad[1] = bi_Cart[1];
bi_Cart_rad[2] = bi_Cart[2];
u_prime[0] = ux1(p);
u_prime[1] = ux2(p);
u_prime[2] = ux3(p);
}

// compute the external force either user-provided or from the atmosphere model
if constexpr (HasExtForce or Atm) {
real_t f_x1 = ZERO, f_x2 = ZERO, f_x3 = ZERO;
if constexpr (::traits::external::HasFx1<F, D>) {
Expand Down Expand Up @@ -421,7 +463,6 @@ namespace kernel::sr {
} else {
raise::KernelError(HERE, "Invalid pusher algorithm for GCA mode");
}
// velocityEMPush(false, p, ei_Cart, bi_Cart);
if constexpr (HasExtForce or Atm) {
ux1(p) += HALF * dt * external_force_Cart[0];
ux2(p) += HALF * dt * external_force_Cart[1];
Expand Down