12#ifndef CD_EBParticleMeshImplem_H
13#define CD_EBParticleMeshImplem_H
22#include <CD_NamespaceHeader.H>
24template <
class P,
class Ret, Ret (P::*MemberFunc)() const>
32 CH_TIME(
"EBParticleMesh::deposit");
34 pout() <<
"EBParticleMesh::deposit" <<
endl;
37 constexpr int numComp = EBParticleMesh::sanitize<Ret>();
63 case DepositionType::NGP: {
72 case DepositionType::CIC: {
81 case DepositionType::TSC: {
98template <
class P,
class Ret, Ret (P::*MemberFunc)()>
105 CH_TIME(
"EBParticleMesh::interpolate(Real)");
107 static_assert(std::is_same<Ret, Real&>::value || std::is_same<Ret, RealVect&>::value,
108 "Ret should be Real& or RealVect&");
110 constexpr int numComp = std::is_same<Ret, Real&>::value ? 1 :
SpaceDim;
125 case DepositionType::NGP: {
131 case DepositionType::CIC: {
137 case DepositionType::TSC: {
144 MayDay::Error(
"EBParticleMesh::interpolate - logic bust");
158 operator()(
Real&
r)
const
174 case DepositionType::NGP: {
178 const auto&
x = p.position();
185 case DepositionType::CIC: {
189 const auto&
x = p.position();
196 case DepositionType::TSC: {
200 const auto&
x = p.position();
222 CH_TIME(
"EBParticleMesh::depositParticleNGP");
245 CH_TIME(
"EBParticleMesh::depositParticleCIC");
268 weight *= std::max(0.0, std::min(
b,
L) - std::max(
a, -
L));
292 CH_TIME(
"EBParticleMesh::depositParticleTSC");
301 const Real a = (
x <= 0.0) ? 2 *
x * (1 +
x) : 2 *
x * (1 -
x);
344 CH_TIME(
"EBParticleMesh::interpolateParticleNGP");
364 CH_TIME(
"EBParticleMesh::interpolateParticleCIC");
387 else if (!(m_ebisbox.isCovered(
particleIV))) {
417 CH_TIME(
"EBParticleMesh::interpolateParticleTSC");
440 else if (!(m_ebisbox.isCovered(
particleIV))) {
450 weight *= 0.75 -
l *
l;
453 weight *= 0.5 * (1.5 -
l) * (1.5 -
l);
468#include <CD_NamespaceFooter.H>
Declaration of a namespace for proto-typing grid and EB loops.
DepositionType
Deposition types.
Definition CD_DepositionType.H:23
Declaration of a class for handling particle-mesh interpolation and deposition.
Declaration of a static class containing some common useful particle routines that would otherwise be...
bool m_verbose
Verbose or not.
Definition CD_EBParticleMesh.H:133
void depositParticleCIC(EBCellFAB &a_rho, const RealVect &a_position, const RealVect &a_particleWidth, const Box &a_particleBox, const Real &a_volumeFactor, const Real *a_strength, const int &a_numComp, const bool a_forceIrregNGP) const noexcept
Function for depositing a single particle with a CIC scheme.
Definition CD_EBParticleMeshImplem.H:236
void interpolateParticleNGP(Real *a_particleField, const EBCellFAB &a_meshData, const RealVect &a_position, const int &a_numComp) const noexcept
Particle interpolation function using an NGP scheme.
Definition CD_EBParticleMeshImplem.H:339
void interpolateParticleTSC(Real *a_particleField, const EBCellFAB &a_meshData, const Box &a_validBox, const Box &a_gatherBox, const RealVect &a_position, const int &a_numComp, const bool a_forceIrregNGP) const noexcept
Particle interpolation function using a TSC scheme.
Definition CD_EBParticleMeshImplem.H:409
void depositParticleNGP(EBCellFAB &a_rho, const RealVect &a_position, const Real &a_volumeFactor, const Real *a_strength, const int &a_numComp) const noexcept
Wrapper function for depositing a single particle with a standard NGP scheme.
Definition CD_EBParticleMeshImplem.H:216
void interpolate(List< P > &a_particles, const EBCellFAB &a_meshData, const DepositionType a_interpType, const bool a_forceIrregNGP=false) const
Interpolate mesh data onto a particle.
Definition CD_EBParticleMeshImplem.H:100
void interpolateParticleCIC(Real *a_particleField, const EBCellFAB &a_meshData, const Box &a_validBox, const Box &a_gatherBox, const RealVect &a_position, const int &a_numComp, const bool a_forceIrregNGP) const noexcept
Particle interpolation function using a CIC scheme.
Definition CD_EBParticleMeshImplem.H:356
void depositParticleTSC(EBCellFAB &a_rho, const RealVect &a_position, const RealVect &a_particleWidth, const Box &a_particleBox, const Real &a_volumeFactor, const Real *a_strength, const int &a_numComp, const bool a_forceIrregNGP) const noexcept
Function for depositing a single particle with a TSC scheme.
Definition CD_EBParticleMeshImplem.H:283
RealVect m_dx
Grid resolution.
Definition CD_EBParticleMesh.H:148
ProblemDomain m_domain
Problem domain.
Definition CD_EBParticleMesh.H:128
void deposit(EBCellFAB &a_meshData, const List< P > &a_particles, const DepositionType a_depositionType, const Real a_widthScale, const bool a_forceIrregNGP=false) const
Deposit a particle onto the mesh.
Definition CD_EBParticleMeshImplem.H:26
static IntVect getParticleCellIndex(const RealVect &a_particlePosition, const RealVect &a_probLo, const Real &a_dx) noexcept
Get the cell index corresponding to the particle position.
Definition CD_ParticleOpsImplem.H:30
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25
ALWAYS_INLINE void loop(const Box &a_computeBox, Functor &&kernel, const IntVect &a_stride=IntVect::Unit)
Launch a C++ kernel over a regular grid.
Definition CD_BoxLoopsImplem.H:20