2 #include "CLHEP/GenericFunctions/ClebschGordanCoefficientSet.hh" 10 std::vector<std::vector<std::complex<double> > >
data;
15 SphericalHarmonicCoefficientSet::SphericalHarmonicCoefficientSet(
unsigned int LMAX):c(new
Clockwork()){
16 for (
unsigned int l=0;l<=LMAX;l++) {
17 std::vector<std::complex<double> > theMs;
18 for (
int m=-l; m<=int(l);m++) {
19 theMs.push_back(std::complex<double> (0.0));
21 c->data.push_back(theMs);
26 SphericalHarmonicCoefficientSet::~SphericalHarmonicCoefficientSet(){
31 SphericalHarmonicCoefficientSet::SphericalHarmonicCoefficientSet(
const SphericalHarmonicCoefficientSet & right):
32 c(new Clockwork(*right.c))
37 unsigned int SphericalHarmonicCoefficientSet::getLMax()
const {
38 return c->data.size()-1;
42 const std::complex<double> &SphericalHarmonicCoefficientSet:: operator () (
unsigned int l,
int m)
const {
43 return c->data[l][m+l];
47 std::complex<double> & SphericalHarmonicCoefficientSet::operator () (
unsigned int l,
int m) {
48 return c->data[l][m+l];
52 std::ostream &
operator << ( std::ostream & o,
const SphericalHarmonicCoefficientSet & c)
54 for (
unsigned int l=0;l<=c.getLMax();l++) {
55 for (
int m=-l;m<=int(l);m++) {
56 o <<
"l=" << l <<
" m=" ;
59 o << m <<
" mag: " << c(l,m) << std::endl;
67 SphericalHarmonicCoefficientSet & SphericalHarmonicCoefficientSet::operator= (
const SphericalHarmonicCoefficientSet & source ){
70 c =
new Clockwork(*source.c);
79 SphericalHarmonicCoefficientSet & SphericalHarmonicCoefficientSet::operator*= (
const std::complex<double> & s ){
80 unsigned int LMAX=getLMax();
81 for (
unsigned int l=0;l<=LMAX;l++) {
82 for (
int m=-l;m<=int(l);m++) {
91 SphericalHarmonicCoefficientSet & SphericalHarmonicCoefficientSet::operator+= (
const SphericalHarmonicCoefficientSet & source ){
92 unsigned int LMAX=getLMax();
93 for (
unsigned int l=0;l<=LMAX;l++) {
94 for (
int m=-l;m<=int(l);m++) {
95 operator()(l,m)+=source(l,m);
103 SphericalHarmonicCoefficientSet & SphericalHarmonicCoefficientSet::operator-= (
const SphericalHarmonicCoefficientSet & source ){
104 unsigned int LMAX=getLMax();
105 for (
unsigned int l=0;l<=LMAX;l++) {
106 for (
int m=-l;m<=int(l);m++) {
107 operator()(l,m)-=source(l,m);
116 std::complex<double>
dot(
const SphericalHarmonicCoefficientSet &a,
117 const SphericalHarmonicCoefficientSet &b) {
119 std::complex<double> result=0.0;
120 if (a.getLMax()!=b.getLMax())
throw std::runtime_error (
"function dot: SphericalHarmonicCoefficientSets of different dimension");
122 for (
unsigned int l=0;l<=a.getLMax();l++) {
123 for (
int m=-l;m<=int(l);m++) {
124 result += a(l,m)*conj(b(l,m));
131 unsigned int LMAX=coefficientsA.getLMax();
132 SphericalHarmonicCoefficientSet coefficientsASq(2*LMAX);
133 static ClebschGordanCoefficientSet clebschGordan;
134 for (
unsigned int L=0;L<=2*LMAX;L++) {
135 for (
int M=-L; M<=int(L); M++) {
136 coefficientsASq(L,M)=0.0;
137 for (
unsigned int l1=0;l1<=LMAX;l1++) {
138 for (
unsigned int l2=0;l2<=LMAX;l2++) {
139 for (
int m1=-l1;m1<=int(l1);m1++) {
140 for (
int m2=-l2;m2<=int(l2);m2++) {
142 if (((l1+l2) >= L) && abs(l1-l2) <= int(L)) {
143 coefficientsASq(L,M) += (coefficientsA(l1,m1)*
144 conj(coefficientsA(l2,m2))*
146 sqrt((2*l1+1)*(2*l2+1)/(4*M_PI*(2*L+1)))*
147 clebschGordan(l1,l2,0,0,L,0)*clebschGordan(l1,l2,m1,-m2,L,M));
156 return coefficientsASq;
std::vector< std::vector< std::complex< double > > > data
SphericalHarmonicCoefficientSet squareExpansionCoefficients(const SphericalHarmonicCoefficientSet &coefficientsA)
std::complex< double > dot(const SphericalHarmonicCoefficientSet &a, const SphericalHarmonicCoefficientSet &b)
std::ostream & operator<<(std::ostream &o, const LegendreCoefficientSet &c)