1#ifndef OPAL_LOAD_BALANCER_H
2#define OPAL_LOAD_BALANCER_H
8template <
typename T,
unsigned Dim>
9using ORB = ippl::OrthogonalRecursiveBisection<Field<double, Dim>,
T>;
11template <
typename T,
unsigned Dim>
13 using Base = ippl::ParticleBase<
14 ippl::ParticleSpatialLayout<T, Dim>, Kokkos::DefaultExecutionSpace::memory_space>;
22 std::shared_ptr<ParticleContainer<T, Dim>>
pc_m;
23 std::shared_ptr<FieldSolver_t>
fs_m;
59 ippl::FieldLayout<Dim>* fl, ippl::UniformCartesian<T, Dim>* mesh,
60 bool& isFirstRepartition) {
63 static IpplTimings::TimerRef tupdateLayout = IpplTimings::getTimer(
"updateLayout");
64 IpplTimings::startTimer(tupdateLayout);
65 (*E_m).updateLayout(*fl);
66 (*rho_m).updateLayout(*fl);
68 if (
fs_m->getStype() ==
"CG") {
69 phi_m->updateLayout(*fl);
75 (*layout).updateLayout(*fl, *mesh);
76 IpplTimings::stopTimer(tupdateLayout);
77 static IpplTimings::TimerRef tupdatePLayout = IpplTimings::getTimer(
"updatePB");
78 IpplTimings::startTimer(tupdatePLayout);
79 if (!isFirstRepartition) {
82 IpplTimings::stopTimer(tupdatePLayout);
85 void initializeORB(ippl::FieldLayout<Dim>* fl, ippl::UniformCartesian<T, Dim>* mesh) {
90 ippl::FieldLayout<Dim>* fl, ippl::UniformCartesian<T, Dim>* mesh,
91 bool& isFirstRepartition) {
94 using Base = ippl::ParticleBase<
95 ippl::ParticleSpatialLayout<T, Dim>, Kokkos::DefaultExecutionSpace::memory_space>;
96 typename Base::particle_position_type* R;
98 bool res =
orb.binaryRepartition(*R, *fl, isFirstRepartition);
100 std::cout <<
"Could not repartition!" << std::endl;
105 if constexpr (
Dim == 2 ||
Dim == 3) {
106 if (
fs_m->getStype() ==
"FFT") {
107 std::get<FFTSolver_t<T, Dim>>(
fs_m->getSolver()).setRhs(*
rho_m);
109 if constexpr (
Dim == 3) {
110 if (
fs_m->getStype() ==
"TG") {
111 std::get<FFTTruncatedGreenSolver_t<T, Dim>>(
fs_m->getSolver()).setRhs(*
rho_m);
112 }
else if (
fs_m->getStype() ==
"OPEN") {
113 std::get<OpenSolver_t<T, Dim>>(
fs_m->getSolver()).setRhs(*
rho_m);
120 if (ippl::Comm->size() < 2) {
124 std::vector<int> res(ippl::Comm->size());
125 double equalPart = (double)totalP / ippl::Comm->size();
126 double dev = std::abs((
double)
pc_m->getLocalNum() - equalPart) / totalP;
131 &local, 1, MPI_INT, res.data(), 1, MPI_INT, ippl::Comm->getCommunicator());
133 for (
unsigned int i = 0; i < res.size(); i++) {
typename ippl::ParticleSpatialLayout< T, Dim, Mesh_t< Dim > > PLayout_t
ippl::Field< T, Dim, Mesh_t< Dim >, Centering_t< Dim >, ViewArgs... > Field
ippl::OrthogonalRecursiveBisection< Field< double, Dim >, T > ORB
ippl::Field< double, Dim, ViewArgs... > Field_t
ippl::Field< ippl::Vector< T, Dim >, Dim, ViewArgs... > VField_t
ippl::detail::size_type size_type
std::shared_ptr< FieldSolver_t > getFieldSolver() const
double loadbalancethreshold_m
void setParticleContainer(std::shared_ptr< ParticleContainer< T, Dim > > pc)
Field_t< Dim > * getRho() const
void setE(VField_t< T, Dim > *E)
void setLoadBalanceThreshold(double threshold)
Field< T, Dim > * getPhi()
LoadBalancer(double lbs, std::shared_ptr< FieldContainer< T, Dim > > &fc, std::shared_ptr< ParticleContainer< T, Dim > > &pc, std::shared_ptr< FieldSolver_t > &fs)
ippl::ParticleBase< ippl::ParticleSpatialLayout< T, Dim >, Kokkos::DefaultExecutionSpace::memory_space > Base
void setRho(Field_t< Dim > *rho)
unsigned int loadbalancefreq_m
double getLoadBalanceThreshold() const
VField_t< T, Dim > * getE() const
ippl::FieldSolverBase< T, Dim > FieldSolver_t
void repartition(ippl::FieldLayout< Dim > *fl, ippl::UniformCartesian< T, Dim > *mesh, bool &isFirstRepartition)
std::shared_ptr< FieldSolver_t > fs_m
void updateLayout(ippl::FieldLayout< Dim > *fl, ippl::UniformCartesian< T, Dim > *mesh, bool &isFirstRepartition)
bool balance(size_type totalP)
std::shared_ptr< ParticleContainer< T, Dim > > getParticleContainer() const
void setPhi(Field< T, Dim > *phi)
void setFieldSolver(std::shared_ptr< FieldSolver_t > fs)
void initializeORB(ippl::FieldLayout< Dim > *fl, ippl::UniformCartesian< T, Dim > *mesh)
std::shared_ptr< ParticleContainer< T, Dim > > pc_m
Container for all per-particle (and per-simulation) fields tracked during OPALX tracking.