20 for (
Int_t m1=-J1; m1<=J1; m1++) {
26 for (m2=J2-1; m2>=-J2; m2--) {
28 cout <<
" Setting m1="<<m1<<
", m2="<<m2<<endl;
32 if (m1+m2<-J||m1+m2>J){
35 cout <<
"#############################################"<<endl;
36 cout <<
"zero CG["<<i<<
"]:" << endl;
41 CG[
i] = CG[i+1]*
TFracNum((J-m)*(J+m+1), (J2-m2)*(J2+m2+1));
43 cout <<
"#############################################"<<endl;
44 cout <<
" first row CG["<<i<<
"]:" << endl;
49 Int_t Denom=(J1+m1)*(J1-m1+1);
51 TFracNum cgm=CG[i-max2+1]*TFracNum((J2-m2)*(J2+m2+1), Denom);
53 cout <<
"cgp:" <<endl; cgp.
Print();
54 cout <<
"cgm:" <<endl; cgm.
Print();
57 TFracNum cgmixed=cgp*cgm;
62 CG[
i]=cgp+cgm+mtwo*cgmixed;
65 cout <<
"#############################################"<<endl;
66 cout <<
" middle CG Works fine!!! CG["<<i<<
"]:" << endl;
72 cout <<
"J="<<J<<
",J1="<<J1<<
",J2="<<J2<<
",m="
73 <<m<<
",m1="<<m1<<
",m2="<<m2<<endl;
74 cgp.
Print(); cgm.Print();
90 cout <<
"#############################################"<<endl;
91 cout <<
"first line Simple setting: CG["<<i<<
"]:" << endl;
96 Int_t Denom=(J-m+1)*(J+m);
98 TFracNum cg2=CG[i-1]*TFracNum((J2+m2)*(J2-m2+1), Denom);
99 TFracNum cgmixed=cg1*cg2;
101 cout <<
"cg1:" <<endl; cg1.
Print();
102 cout <<
"cg2:" <<endl; cg2.Print();
103 cout <<
"cgmixed:" <<endl; cgmixed.
Print();
105 if (cgmixed.
Sqrt()) {
108 CG[
i]=cg1+cg2+two*cgmixed;
110 cout <<
"#############################################"<<endl;
111 cout <<
" first line Works fine!!! CG["<<i<<
"]:" << endl;
117 cout <<
"J="<<J<<
",J1="<<J1<<
",J2="<<J2<<
",m="
118 <<m<<
",m1="<<m1<<
",m2="<<m2<<endl;
119 cg1.
Print(); cg2.Print();
127 if (J<J1+J2 && m1!=-J1 && J+m1<=J2) {
132 Int_t Denom=(J2-m2)*(J2+m2+1);
134 TFracNum cg2=CG[i-max2+1]*TFracNum((J1+m1)*(J1-m1+1), Denom);
136 cout <<
"cg1:" <<endl; cg1.
Print();
137 cout <<
"cg2:" <<endl; cg2.
Print();
139 TFracNum cgmixed=cg1*cg2;
140 if (cgmixed.
Sqrt()) {
144 CG[
i]=cg1+cg2+mtwo*cgmixed;
147 cout <<
"#############################################"<<endl;
148 cout <<
"lower triangle Works fine!!! CG["<<i<<
"]:" << endl;
154 cout <<
"J="<<J<<
",J1="<<J1<<
",J2="<<J2<<
",m="
155 <<m<<
",m1="<<m1<<
",m2="<<m2<<endl;
156 cg1.
Print(); cg2.Print();
163 Int_t overall_sign=0;
169 if (m1+m2==J && !(CG[
i]==ZERO)) {
174 for (
Int_t m=-J; m<=J; m++) {
209 if ( J==CGJ[
i] && J1==CGJ1[
i] && J2==CGJ2[
i] )
213 cout <<
"Registering Clebsch-Gordans for J="<<J
214 <<
" J1="<<J1<<
" J2="<<J2<< endl;
229 newCG[NCG-1] = ClebschGordan(2*J, 2*J1, 2*J2);
249 if ( twoJ<0 || twoJ1<0 || twoJ2<0 ||
250 twoJ<twoJ1-twoJ2 || twoJ<twoJ2-twoJ1 || twoJ>twoJ1+twoJ2 ) {
251 cerr <<
"Clebsch-Gordan-Coefficient only for positive J's"
252 <<
" with |J1-J2|<=J<=J1+J2" << endl;
255 Int_t nom_ptr[1]={1};
257 TFracNum mtwo(1, 0, nom_ptr, 0, -1);
265 Int_t mintwom1=-twoJ1;
266 if (twoJ+twoJ2<twoJ1) mintwom1=-twoJ-twoJ2;
267 Int_t minIndex=(mintwom1+twoJ1)/2*max2 + max2-1;
270 cout <<
"#############################################"<<endl;
271 cout <<
" first row CG["<<minIndex<<
"]:" << endl;
272 CG[minIndex].
Print();
275 for (
Int_t twom1=-twoJ1; twom1<=twoJ1; twom1+=2) {
276 Int_t twoi1=twom1+twoJ1;
282 for (twom2=twoJ2-2; twom2>=-twoJ2; twom2-=2) {
284 cout <<
" Setting twom1="<<twom1<<
", twom2="<<twom2<<endl;
287 twoi=twoi1*max2+twoi2;
289 if ( twom1+twom2<-twoJ || twom1+twom2>twoJ ) {
292 cout <<
"#############################################"<<endl;
293 cout <<
"zero CG["<<i<<
"]:" << endl;
297 else if (twom1==mintwom1) {
298 CG[
i] = CG[i+1]*
TFracNum((twoJ-twom)*(twoJ+twom+2),
299 (twoJ2-twom2)*(twoJ2+twom2+2));
301 cout <<
"#############################################"<<endl;
302 cout <<
" first row CG["<<i<<
"]:" << endl;
306 else if (twom1+twom2!=-twoJ) {
307 Int_t Denom=(twoJ1+twom1)*(twoJ1-twom1+2);
309 TFracNum cgm=CG[i-max2+1]*TFracNum((twoJ2-twom2)*(twoJ2+twom2+2),
312 cout <<
"cgp:" <<endl; cgp.
Print();
313 cout <<
"cgm:" <<endl; cgm.
Print();
316 TFracNum cgmixed=cgp*cgm;
317 if (cgmixed.
Sqrt()) {
321 CG[
i]=cgp+cgm+mtwo*cgmixed;
324 cout <<
"#############################################"<<endl;
325 cout <<
" middle CG Works fine!!! CG["<<i<<
"]:" << endl;
331 cout <<
"2*J="<<twoJ<<
",2*J1="<<twoJ1<<
",2*J2="<<twoJ2<<
",2*m="
332 <<twom<<
",2*m1="<<twom1<<
",2*m2="<<twom2<<endl;
333 cgp.
Print(); cgm.Print();
339 CG[
i] = CG[i-max2+1]*
TFracNum(-(twoJ2-twom2)*(twoJ2+twom2+2),
340 (twoJ1+twom1)*(twoJ1-twom1+2));
342 cout <<
"#############################################"<<endl;
343 cout <<
" first row CG["<<i<<
"]:" << endl;
353 cout <<
" special setting twom1="<<twom1<<
", twom2="<<twom2<<endl;
356 twoi=twoi1*max2+twoi2;
358 if (twom1+twom2<-twoJ || twom1+twom2>twoJ) {
361 cout <<
"#############################################"<<endl;
362 cout <<
"first line Simple setting: CG["<<i<<
"]:" << endl;
366 else if (twom1>mintwom1 && twom1<=-mintwom1) {
367 Int_t Denom=(twoJ-twom+2)*(twoJ+twom);
369 TFracNum cg2=CG[i-1]*TFracNum((twoJ2+twom2)*(twoJ2-twom2+2), Denom);
370 TFracNum cgmixed=cg1*cg2;
372 cout <<
"cg1:" <<endl; cg1.
Print();
373 cout <<
"cg2:" <<endl; cg2.Print();
374 cout <<
"cgmixed:" <<endl; cgmixed.
Print();
376 if (cgmixed.
Sqrt()) {
379 CG[
i]=cg1+cg2+two*cgmixed;
381 cout <<
"#############################################"<<endl;
382 cout <<
" first line Works fine!!! CG["<<i<<
"]:" << endl;
388 cout <<
"2*J="<<twoJ<<
",2*J1="<<twoJ1<<
",2*J2="<<twoJ2<<
",2*m="
389 <<twom<<
",2*m1="<<twom1<<
",2*m2="<<twom2<<endl;
390 cg1.
Print(); cg2.Print();
398 if (twoJ<twoJ1+twoJ2 &&
405 twoi=twoi1*max2+twoi2;
407 Int_t Denom=(twoJ2-twom2)*(twoJ2+twom2+2);
409 TFracNum cg2=CG[i-max2+1]*TFracNum((twoJ1+twom1)*(twoJ1-twom1+2), Denom);
411 cout <<
"cg1:" <<endl; cg1.
Print();
412 cout <<
"cg2:" <<endl; cg2.
Print();
414 TFracNum cgmixed=cg1*cg2;
415 if (cgmixed.
Sqrt()) {
419 CG[
i]=cg1+cg2+mtwo*cgmixed;
422 cout <<
"#############################################"<<endl;
423 cout <<
"lower triangle Works fine!!! CG["<<i<<
"]:" << endl;
429 cout <<
"2*J="<<twoJ<<
",2*J1="<<twoJ1<<
",2*J2="<<twoJ2<<
",2*m="
430 <<twom<<
",2*m1="<<twom1<<
",2*m2="<<twom2<<endl;
431 cg1.
Print(); cg2.Print();
438 Int_t overall_sign=0;
442 Int_t twom1=2*(
i/max2)-twoJ1;
443 Int_t twom2=2*(
i%max2)-twoJ2;
444 if (twom1+twom2==twoJ && !(CG[
i]==ZERO)) {
449 for (
Int_t twom=-twoJ; twom<=twoJ; twom+=2) {
454 Int_t twom1=2*(
i/max2)-twoJ1;
455 Int_t twom2=2*(
i%max2)-twoJ2;
456 if (twom1+twom2==twom) {
461 cout <<
"2m="<<twom <<
": adding " << CGAbs.
FracString()<<
" -> "
468 Int_t twom1=2*(
i/max2)-twoJ1;
469 Int_t twom2=2*(
i%max2)-twoJ2;
470 if (twom1+twom2==twom) {
481 return (J1+m1)*(2*J2+1) + J2+m2;