47template<
unsigned int Dim>
52 template<
class T,
class FT,
class FT2>
54 grn_r = grnI_p[0] * hrsq_r[0] + grnI_p[1] * hrsq_r[1] + grnI_p[2] * hrsq_r[2];
56 grn_r[0][0][0] = grn_r[0][0][1];
69 for (
unsigned d = 0; d<
Dim; ++d) {
70 sqr += diff[d]*diff[d];
92 P_r.
Ef[i] -= P_r.
Q[j]*Fij;
93 P_r.
Ef[j] += P_r.
Q[i]*Fij;
108 double interaction_radius,
109 double alpha, std::string greensFunction):
112 interaction_radius_m(interaction_radius),
115 Inform msg(
"P3MPoissonSolver::P3MPoissonSolver ");
140 for(
int d = 0; d < 3; ++ d) {
150 for (
int i = 0; i < 3; ++ i) {
177 for (
int i = 0; i < 3; ++ i) {
190 for (
int i = 0; i < 3; ++ i)
200 for (
int i = 0; i < 3; ++ i) {
219 for(std::size_t i = 0;i<size;++i)
221 tmpBunch_r.
R[i](2) = tmpBunch_r.
R[i](2) * gammaz;
237 for(std::size_t i = 0;i<size;++i)
239 tmpBunch_r.
R[i](2) = tmpBunch_r.
R[i](2) / gammaz;
288 rho_r *= hr[0] * hr[1] * hr[2];
300 throw OpalException(
"P3MPoissonSolver",
"not implemented yet");
341 for(
int k = idx[2].first(); k <= idx[2].last() + 1; k++) {
342 for(
int j = idx[1].first(); j <= idx[1].last() + 1; j++) {
343 for(
int i = idx[0].first(); i <= idx[0].last() + 1; i++) {
350 double r =
std::sqrt(vv(0) * vv(0) + vv(1) * vv(1) + vv(2) * vv(2));
353 tmpgrn = -vv(2) * vv(2) *
std::atan(vv(0) * vv(1) / (vv(2) * r)) / 2;
354 tmpgrn += -vv(1) * vv(1) *
std::atan(vv(0) * vv(2) / (vv(1) * r)) / 2;
355 tmpgrn += -vv(0) * vv(0) *
std::atan(vv(1) * vv(2) / (vv(0) * r)) / 2;
356 tmpgrn += vv(1) * vv(2) *
std::log(vv(0) + r);
357 tmpgrn += vv(0) * vv(2) *
std::log(vv(1) + r);
358 tmpgrn += vv(0) * vv(1) *
std::log(vv(2) + r);
418 os <<
"* ************* P 3 M - P o i s s o n S o l v e r *************** " <<
endl;
419 os <<
"* h " <<
hr_m <<
'\n';
421 os <<
"* ALPHA " <<
alpha_m <<
'\n';
422 os <<
"* *************************************************************** " <<
endl;
FTps< T, N > erf(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Error function.
UniformCartesian< 3, double > Mesh_t
CenteredFieldLayout< 3, Mesh_t, Center_t > FieldLayout_t
Tps< T > log(const Tps< T > &x)
Natural logarithm.
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Tps< T > exp(const Tps< T > &x)
Exponential.
Tps< T > sqrt(const Tps< T > &x)
Square root.
PETE_TUTree< FnArcTan, typename T::PETE_Expr_t > atan(const PETE_Expr< T > &l)
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, PETE_Scalar< Vektor< T, Dim > > > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const Vektor< T, Dim > &f)
Inform & endl(Inform &inf)
constexpr double epsilon_0
The permittivity of vacuum in As/Vm.
constexpr double alpha
The fine structure constant, no dimension.
constexpr double pi
The value of.
bool lt(double x, double y)
ParticleAttrib< Vector_t > Ef
size_t getLocalNum() const
ParticleAttrib< double > Q
size_t getGhostNum() const
static void calculate(Vektor< T, 3 > &hrsq_r, FT &grn_r, FT2 *grnI_p, double alpha)
ApplyField(double alpha_, double ke_, bool isIntGreen_)
void operator()(std::size_t i, std::size_t j, PartBunch &P_r) const
void calculatePairForces(PartBunchBase< double, 3 > *bunch, double gammaz) override
IpplTimings::TimerRef CalculatePairForces_m
IpplTimings::TimerRef ComputePotential_m
std::unique_ptr< FieldLayout_t > layout4_mp
double interaction_radius_m
void integratedGreensFunction()
FieldLayout_t * layout_mp
std::unique_ptr< Mesh_t > mesh4_mp
std::unique_ptr< Mesh_t > mesh3_mp
std::unique_ptr< FFT_t > fft_mp
void computePotential(Field_t &rho, Vector_t hr) override
IpplTimings::TimerRef GreensFunctionTimer_m
std::unique_ptr< FieldLayout_t > layout2_mp
FFT< RCTransform, 3, double > FFT_t
Inform & print(Inform &os) const
NDIndex< 3 > domainFFTConstruct_m
std::unique_ptr< FieldLayout_t > layout3_mp
std::unique_ptr< Mesh_t > mesh2_mp
P3MPoissonSolver(Mesh_t *mesh, FieldLayout_t *fl, double interaction_radius, double alpha, std::string greensFunction)
The base class for all OPAL exceptions.
void initialize(Layout_t &)
const NDIndex< Dim > & getDomain() const
e_dim_tag getRequestedDistribution(unsigned int d) const
MFLOAT get_meshSpacing(unsigned d) const
void forEach(const Pred &pred_r, const OP &op_r)
static TimerRef getTimer(const char *nm)
static void stopTimer(TimerRef t)
static void startTimer(TimerRef t)
Vektor< double, 3 > Vector_t