1#ifndef IPPL_ALPINE_MANAGER_H
2#define IPPL_ALPINE_MANAGER_H
19template <
typename T,
unsigned Dim>
21 FieldContainer<T, Dim>, LoadBalancer<T, Dim>> {
39 std::string& solver_, std::string& stepMethod_,
40 std::vector<std::string> preconditioner_params = {})
109 this->time_m += this->dt_m;
115 m <<
"Finished time step: " << this->it_m <<
" time: " << this->time_m <<
endl;
121 gather(this->
pcontainer_m->E, this->fcontainer_m->getE(), this->pcontainer_m->R);
138 scatter(*q, *rho, *R);
139 double relError = std::fabs((Q - (*rho).sum()) / Q);
141 m << relError <<
endl;
146 ippl::Comm->reduce(localParticles, TotalParticles, 1, std::plus<size_type>());
149 if (TotalParticles !=
totalP_m || relError > 1e-10) {
151 m <<
"Total particles in the sim. " <<
totalP_m <<
" "
152 <<
"after update: " << TotalParticles <<
endl;
153 m <<
"Rel. error in charge conservation: " << relError <<
endl;
158 double cellVolume = std::reduce(hr.
begin(), hr.
end(), 1., std::multiplies<double>());
159 (*rho) = (*rho) / cellVolume;
164 if (this->
fsolver_m->getStype() !=
"OPEN") {
166 for (
unsigned d = 0; d <
Dim; d++) {
167 size *= rmax[d] - rmin[d];
169 *rho = *rho - (Q / size);
typename ippl::detail::ViewType< ippl::Vector< double, Dim >, 1 >::view_type view_type
ippl::detail::size_type size_type
Field< double, Dim, ViewArgs... > Field_t
ippl::Vector< T, Dim > Vector_t
Inform & endl(Inform &inf)
std::unique_ptr< mpi::Communicator > Comm
A template class for managing Particle-in-Cell (PIC) simulations.
std::shared_ptr< ParticleContainer< T, Dim > > pcontainer_m
std::shared_ptr< ippl::FieldSolverBase< T, Dim > > fsolver_m
std::shared_ptr< FieldContainer< T, Dim > > fcontainer_m
typename ippl::ParticleSpatialLayout< T, Dim >::particle_position_type particle_position_type
KOKKOS_INLINE_FUNCTION constexpr iterator begin()
KOKKOS_INLINE_FUNCTION constexpr iterator end()
void setStepMethod(const std::string &stepMethod_)
void setLoadBalanceThreshold(double lbt_)
Vector_t< double, Dim > kw_m
void par2grid() override
Particle-to-grid operation.
ParticleContainer< T, Dim > ParticleContainer_t
void setNr(const Vector_t< int, Dim > &nr_)
std::vector< std::string > getPreconditionerParams() const
size_type getTotalP() const
Vector_t< double, Dim > origin_m
const std::string & getStepMethod() const
ippl::NDIndex< Dim > domain_m
Vector_t< int, Dim > nr_m
Vector_t< double, Dim > hr_m
std::vector< std::string > preconditioner_params_m
void post_step() override
A method that should be used after perfoming a step of simulation.
const Vector_t< int, Dim > & getNr() const
Vector_t< double, Dim > rmin_m
void setTime(double time_)
LoadBalancer< T, Dim > LoadBalancer_t
const std::string & getSolver() const
void pre_step() override
A method that should be used for preparation before perfoming a step of simulation.
void setSolver(const std::string &solver_)
FieldContainer< T, Dim > FieldContainer_t
FieldSolver< T, Dim > FieldSolver_t
bool isFirstRepartition_m
ippl::ParticleBase< ippl::ParticleSpatialLayout< T, Dim > > Base
void setTotalP(size_type totalP_)
std::array< bool, Dim > decomp_m
Vector_t< double, Dim > rmax_m
AlpineManager(size_type totalP_, int nt_, Vector_t< int, Dim > &nr_, double lbt_, std::string &solver_, std::string &stepMethod_, std::vector< std::string > preconditioner_params={})
void grid2par() override
Grid-to-particle operation.
double getLoadBalanceThreshold() const