8#ifndef SOLIDHARMONICSEXPANSION_H_
9#define SOLIDHARMONICSEXPANSION_H_
11#include "bhfmm/utils/Vector3.h"
12#include "bhfmm/expansions/SolidHarmonicsStorage.h"
13#include "bhfmm/utils/WignerMatrix.h"
15#include "bhfmm/fft/FFTAccelerableExpansion.h"
21class SolidHarmonicsExpansion;
28void swap(SolidHarmonicsExpansion & s1, SolidHarmonicsExpansion & s2);
38double potentialML(
const SolidHarmonicsExpansion & ME,
const SolidHarmonicsExpansion & LE);
48Vector3<double>
forceGradLAndM(
const SolidHarmonicsExpansion & LE,
const SolidHarmonicsExpansion & ME);
61Vector3<double>
forceLAndGradM(
const SolidHarmonicsExpansion & LE,
const SolidHarmonicsExpansion & ME);
210 void scaleL(
double factor);
218 void scaleM(
double factor);
220 void rotatePhi(
const double* CosSinPhi,
int negate);
289 double & get_C(
unsigned l,
unsigned m) {
303 double & get_S(
unsigned l,
unsigned m) {
307 int getNumEntries()
const {
323 for (
int i = 0; i < end; ++i) {
324 buf[position++] = acc_c_C_seq(i);
326 for (
int i = 0; i < end; ++i) {
327 buf[position++] = acc_c_S_seq(i);
331 void readValuesFromMPIBuffer(
double * buf,
int& position) {
333 for (
int i = 0; i < end; ++i) {
334 acc_C_seq(i) = buf[position++];
336 for (
int i = 0; i < end; ++i) {
337 acc_S_seq(i) = buf[position++];
340 void addValuesFromMPIBuffer(
double * buf,
int& position) {
342 for (
int i = 0; i < end; ++i) {
343 acc_C_seq(i) += buf[position++];
345 for (
int i = 0; i < end; ++i) {
346 acc_S_seq(i) += buf[position++];
358 double & acc_C(
int l,
int m) {
367 double & acc_S(
int l,
int m) {
375 double & acc_C_seq(
int r) {
383 double & acc_S_seq(
int r) {
392 double acc_c_C(
int l,
int m)
const {
401 double acc_c_S(
int l,
int m)
const {
409 double acc_c_C_seq(
int r)
const {
417 double acc_c_S_seq(
int r)
const {
430 void signed_acc_const_CS(
int l,
int m,
double & c,
double & s)
const {
431 const int ind = _c.
index(l, abs(m));
437 const int minus_one_pow_m = (m & 1) ? -1.0 : 1.0;
438 c *= minus_one_pow_m;
439 s *= -minus_one_pow_m;
452 SolidHarmonicsStorage _c;
459 SolidHarmonicsStorage _s;
469SolidHarmonicsExpansion
operator+(SolidHarmonicsExpansion LHS,
const SolidHarmonicsExpansion & RHS);
477SolidHarmonicsExpansion
operator*(
double scalar, SolidHarmonicsExpansion RHS);
485SolidHarmonicsExpansion
evaluateLOfR(
int order, Vector3<double> r);
493SolidHarmonicsExpansion
evaluateMOfR(
int order, Vector3<double> r);
501SolidHarmonicsExpansion
convoluteLL(
const SolidHarmonicsExpansion & LE1,
const SolidHarmonicsExpansion & LE2);
509SolidHarmonicsExpansion
convoluteLL_Z(
const SolidHarmonicsExpansion & LE1,
const SolidHarmonicsExpansion & LE2);
517SolidHarmonicsExpansion
convoluteLM(
const SolidHarmonicsExpansion & LE,
const SolidHarmonicsExpansion & ME);
525SolidHarmonicsExpansion
convoluteLM_Z(
const SolidHarmonicsExpansion & LE,
const SolidHarmonicsExpansion & ME);
533SolidHarmonicsExpansion
convoluteL_ZM(
const SolidHarmonicsExpansion & LE,
const SolidHarmonicsExpansion & ME);
541SolidHarmonicsExpansion
rotatePhi(
const SolidHarmonicsExpansion & E,
const double* CosSinPhi,
int negate);
543SolidHarmonicsExpansion rotateThetaL(
const SolidHarmonicsExpansion & LE,
const WignerMatrix& W);
545SolidHarmonicsExpansion rotateThetaM(
const SolidHarmonicsExpansion & ME,
const WignerMatrix& W);
547SolidHarmonicsExpansion setAtMinusR(SolidHarmonicsExpansion E);
Definition: FFTAccelerableExpansion.h:21
Definition: SolidHarmonicsExpansion.h:75
SolidHarmonicsExpansion & operator*=(double scalar)
Definition: SolidHarmonicsExpansion.cpp:61
friend Vector3< double > forceLAndGradM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:604
void writeValuesToMPIBuffer(double *buf, int &position) const
Definition: SolidHarmonicsExpansion.h:321
SolidHarmonicsExpansion & operator+=(const SolidHarmonicsExpansion &RHS)
Definition: SolidHarmonicsExpansion.cpp:49
void evaluateLOfR(Vector3< double > r)
Definition: SolidHarmonicsExpansion.cpp:79
int getOrder() const
Definition: SolidHarmonicsExpansion.h:275
void evaluateMOfR(Vector3< double > r)
Definition: SolidHarmonicsExpansion.cpp:125
void convoluteLL_Z(const SolidHarmonicsExpansion &LE1, const SolidHarmonicsExpansion &LE2)
Definition: SolidHarmonicsExpansion.cpp:213
double & getC(int l, int m)
Definition: SolidHarmonicsExpansion.h:285
double & getS(int l, int m)
Definition: SolidHarmonicsExpansion.h:299
void setAtMinusR()
Definition: SolidHarmonicsExpansion.cpp:507
virtual ~SolidHarmonicsExpansion()
Definition: SolidHarmonicsExpansion.cpp:32
void scaleM(double factor)
Definition: SolidHarmonicsExpansion.cpp:390
void convoluteL_ZM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:340
SolidHarmonicsExpansion & operator=(SolidHarmonicsExpansion RHS)
Definition: SolidHarmonicsExpansion.cpp:43
friend Vector3< double > forceGradLAndM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:547
friend double potentialML(const SolidHarmonicsExpansion &ME, const SolidHarmonicsExpansion &LE)
Definition: SolidHarmonicsExpansion.cpp:524
friend void swap(SolidHarmonicsExpansion &s1, SolidHarmonicsExpansion &s2)
Definition: SolidHarmonicsExpansion.cpp:35
void convoluteLL(const SolidHarmonicsExpansion &LE1, const SolidHarmonicsExpansion &LE2)
Definition: SolidHarmonicsExpansion.cpp:169
void print() const
Definition: SolidHarmonicsExpansion.cpp:642
void convoluteLM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:253
void clearMonopole()
Definition: SolidHarmonicsExpansion.cpp:502
void clear()
Definition: SolidHarmonicsExpansion.cpp:73
void convoluteLM_Z(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:298
SolidHarmonicsExpansion(int order, bool initializeToZero=true)
Definition: SolidHarmonicsExpansion.cpp:18
void scaleL(double factor)
Definition: SolidHarmonicsExpansion.cpp:379
int index(int l, int m) const
Definition: SolidHarmonicsStorage.h:96
int getTotalNumValues() const
Definition: SolidHarmonicsStorage.cpp:82
double & getValue(int l, int m)
Definition: SolidHarmonicsStorage.h:110
double getValueConst(int l, int m) const
Definition: SolidHarmonicsStorage.h:129
double getValueConstSequential(int i) const
Definition: SolidHarmonicsStorage.h:138
double & getValueSequential(int i)
Definition: SolidHarmonicsStorage.h:119
Definition: WignerMatrix.h:22
Definition: L2PCellProcessor.cpp:15
Vector3< double > forceLAndGradM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:604
SolidHarmonicsExpansion operator*(double scalar, SolidHarmonicsExpansion RHS)
Definition: SolidHarmonicsExpansion.cpp:67
SolidHarmonicsExpansion evaluateLOfR(int order, Vector3< double > r)
Definition: SolidHarmonicsExpansion.cpp:118
SolidHarmonicsExpansion convoluteLL(const SolidHarmonicsExpansion &LE1, const SolidHarmonicsExpansion &LE2)
Definition: SolidHarmonicsExpansion.cpp:205
SolidHarmonicsExpansion evaluateMOfR(int order, Vector3< double > r)
Definition: SolidHarmonicsExpansion.cpp:162
SolidHarmonicsExpansion operator+(SolidHarmonicsExpansion LHS, const SolidHarmonicsExpansion &RHS)
Definition: SolidHarmonicsExpansion.cpp:56
Vector3< double > forceGradLAndM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:547
double potentialML(const SolidHarmonicsExpansion &ME, const SolidHarmonicsExpansion &LE)
Definition: SolidHarmonicsExpansion.cpp:524
SolidHarmonicsExpansion convoluteLM_Z(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:332
SolidHarmonicsExpansion convoluteLM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:290
SolidHarmonicsExpansion rotatePhi(const SolidHarmonicsExpansion &E, const double *CosSinPhi, int negate)
Definition: SolidHarmonicsExpansion.cpp:475
SolidHarmonicsExpansion convoluteL_ZM(const SolidHarmonicsExpansion &LE, const SolidHarmonicsExpansion &ME)
Definition: SolidHarmonicsExpansion.cpp:371
SolidHarmonicsExpansion convoluteLL_Z(const SolidHarmonicsExpansion &LE1, const SolidHarmonicsExpansion &LE2)
Definition: SolidHarmonicsExpansion.cpp:245
void swap(SolidHarmonicsExpansion &s1, SolidHarmonicsExpansion &s2)
Definition: SolidHarmonicsExpansion.cpp:35