ls1-MarDyn
ls1-MarDyn molecular dynamics code
SolidHarmonicsExpansion.h
1/*
2 * SolidHarmonicsExpansion.h
3 *
4 * Created on: Nov 21, 2014
5 * Author: tchipevn, rajats
6 */
7
8#ifndef SOLIDHARMONICSEXPANSION_H_
9#define SOLIDHARMONICSEXPANSION_H_
10
11#include "bhfmm/utils/Vector3.h"
12#include "bhfmm/expansions/SolidHarmonicsStorage.h"
13#include "bhfmm/utils/WignerMatrix.h"
14#ifdef FMM_FFT
15#include "bhfmm/fft/FFTAccelerableExpansion.h"
16#endif /* FMM_FFT */
17#include <cstdlib>
18#include <cmath>
19
20namespace bhfmm {
21class SolidHarmonicsExpansion;
22
28void swap(SolidHarmonicsExpansion & s1, SolidHarmonicsExpansion & s2);
29
38double potentialML(const SolidHarmonicsExpansion & ME, const SolidHarmonicsExpansion & LE);
39
48Vector3<double> forceGradLAndM(const SolidHarmonicsExpansion & LE, const SolidHarmonicsExpansion & ME);
49
61Vector3<double> forceLAndGradM(const SolidHarmonicsExpansion & LE, const SolidHarmonicsExpansion & ME);
62
72#ifdef FMM_FFT
74#endif /* FMM_FFT */
75{
76public:
82 SolidHarmonicsExpansion(int order, bool initializeToZero = true);
83
89
94
101
102 // OPERATORS //
109
116
122 SolidHarmonicsExpansion & operator*=(double scalar);
123
124 // METHODS //
128 void clear();
129
137
144
154 void convoluteLL(const SolidHarmonicsExpansion & LE1, const SolidHarmonicsExpansion & LE2);
155
168
179
191
203
210 void scaleL(double factor);
211
218 void scaleM(double factor);
219
220 void rotatePhi(const double* CosSinPhi, int negate);
221
222 void convoluteWL(const WignerMatrix & W, const SolidHarmonicsExpansion & LE);
223
224 void convoluteWM(const WignerMatrix & W, const SolidHarmonicsExpansion & ME);
225
230 void clearMonopole();
231
237 void setAtMinusR();
238
247 friend double potentialML(const SolidHarmonicsExpansion & ME, const SolidHarmonicsExpansion & LE);
248
258
271
275 int getOrder() const {
276 return _order;
277 }
278
285 double & getC(int l, int m) {
286 return acc_C(l,m);
287 }
288 //for FFTAccelerableExpansion
289 double & get_C(unsigned l, unsigned m) {
290 return acc_C(l,m);
291 }
292
299 double & getS(int l, int m) {
300 return acc_S(l,m);
301 }
302 //for FFTAccelerableExpansion
303 double & get_S(unsigned l, unsigned m) {
304 return acc_S(l,m);
305 }
306
307 int getNumEntries() const {
308 return _c.getTotalNumValues() + _s.getTotalNumValues();
309 }
310
314 void print() const;
315
321 void writeValuesToMPIBuffer(double * buf, int& position) const {
322 const int end = _c.getTotalNumValues();
323 for (int i = 0; i < end; ++i) {
324 buf[position++] = acc_c_C_seq(i);
325 }
326 for (int i = 0; i < end; ++i) {
327 buf[position++] = acc_c_S_seq(i);
328 }
329 }
330
331 void readValuesFromMPIBuffer(double * buf, int& position) {
332 const int end = _c.getTotalNumValues();
333 for (int i = 0; i < end; ++i) {
334 acc_C_seq(i) = buf[position++];
335 }
336 for (int i = 0; i < end; ++i) {
337 acc_S_seq(i) = buf[position++];
338 }
339 }
340 void addValuesFromMPIBuffer(double * buf, int& position) {
341 const int end = _c.getTotalNumValues();
342 for (int i = 0; i < end; ++i) {
343 acc_C_seq(i) += buf[position++];
344 }
345 for (int i = 0; i < end; ++i) {
346 acc_S_seq(i) += buf[position++];
347 }
348 }
349
350private:
351 //private accessors to C and S terms
352
358 double & acc_C(int l, int m) {
359 return _c.getValue(l, m);
360 }
361
367 double & acc_S(int l, int m) {
368 return _s.getValue(l, m);
369 }
370
375 double & acc_C_seq(int r) {
376 return _c.getValueSequential(r);
377 }
378
383 double & acc_S_seq(int r) {
384 return _s.getValueSequential(r);
385 }
386
392 double acc_c_C(int l, int m) const {
393 return _c.getValueConst(l, m);
394 }
395
401 double acc_c_S(int l, int m) const {
402 return _s.getValueConst(l, m);
403 }
404
409 double acc_c_C_seq(int r) const {
410 return _c.getValueConstSequential(r);
411 }
412
417 double acc_c_S_seq(int r) const {
418 return _s.getValueConstSequential(r);
419 }
420
430 void signed_acc_const_CS(int l, int m, double & c, double & s) const {
431 const int ind = _c.index(l, abs(m));
432 c = _c.getValueConstSequential(ind);
433 s = _s.getValueConstSequential(ind);
434 if (m >= 0) {
435 return;
436 } else {
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;
440 }
441 }
442
443protected:
444 int _order;
445
446private:
452 SolidHarmonicsStorage _c;
453
459 SolidHarmonicsStorage _s; // S-terms: imaginary or (-imaginary) part, see 13.4.8
460
461};
462
469SolidHarmonicsExpansion operator+(SolidHarmonicsExpansion LHS, const SolidHarmonicsExpansion & RHS);
470
477SolidHarmonicsExpansion operator*(double scalar, SolidHarmonicsExpansion RHS);
478
485SolidHarmonicsExpansion evaluateLOfR(int order, Vector3<double> r);
486
493SolidHarmonicsExpansion evaluateMOfR(int order, Vector3<double> r);
494
501SolidHarmonicsExpansion convoluteLL(const SolidHarmonicsExpansion & LE1, const SolidHarmonicsExpansion & LE2);
502
509SolidHarmonicsExpansion convoluteLL_Z(const SolidHarmonicsExpansion & LE1, const SolidHarmonicsExpansion & LE2);
510
517SolidHarmonicsExpansion convoluteLM(const SolidHarmonicsExpansion & LE, const SolidHarmonicsExpansion & ME);
518
525SolidHarmonicsExpansion convoluteLM_Z(const SolidHarmonicsExpansion & LE, const SolidHarmonicsExpansion & ME);
526
533SolidHarmonicsExpansion convoluteL_ZM(const SolidHarmonicsExpansion & LE, const SolidHarmonicsExpansion & ME);
534
541SolidHarmonicsExpansion rotatePhi(const SolidHarmonicsExpansion & E, const double* CosSinPhi, int negate);
542
543SolidHarmonicsExpansion rotateThetaL(const SolidHarmonicsExpansion & LE, const WignerMatrix& W);
544
545SolidHarmonicsExpansion rotateThetaM(const SolidHarmonicsExpansion & ME, const WignerMatrix& W);
546
547SolidHarmonicsExpansion setAtMinusR(SolidHarmonicsExpansion E);
548
549} /* namespace bhfmm */
550
551#endif /* SOLIDHARMONICSEXPANSION_H_ */
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: Vector3.h:34
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