29STATIC double ritoa(
long li,
long lf,
long nelem,
double k,
double RI2 );
49 d2 =
zJint * sin(theta),
60 long int rep = 0, ddiv, divsor;
69 if( (fabs(vv)) - (
int)(fabs(vv)) > 0.5 )
70 ddiv = (int)(fabs(vv)) + 1;
72 ddiv = (int)(fabs(vv));
74 divsor = ((ddiv == 0) ? 1 : ddiv);
78 for( rep = 0; rep < divsor; rep++ )
81 rl = (((double) rep)/((double) divsor)),
82 ru = (((
double) (rep+1))/((double) divsor)),
147 double nstar,
long int l,
148 double npstar,
long int lp,
152 double n_c = ((2.0 * nstar * npstar ) / ( nstar + npstar ));
154 double D_n = (nstar - npstar);
155 double D_l = (double) ( l - lp );
156 double lg = (double) ( (lp > l) ? lp : l);
160 double f = ( 1.0 -
g );
161 double e = (( f >= 0.0) ? sqrt( f ) : 0.0 );
163 double x = (e * D_n);
164 double z = (-1.0 * x);
165 double v1 = (D_n + 1.0);
166 double v2 = (D_n - 1.0);
168 double d1,d2,d7,d8,d9,d34,d56,d6_1;
196 d2 = (n_c * n_c)/(2.0 * D_n);
198 d34 = (1.0 - ((D_l * lg)/n_c)) *
AngerJ( v1, z );
200 d56 = (1.0 + ((D_l * lg)/n_c)) *
AngerJ( v2, z );
204 d7 = (2./
PI) * sin( d6_1 ) * (1.0 - e);
206 d8 = d1 * d2 * ( (d34) - (d56) + d7 );
213 ASSERT( (l == lp + 1) || ( l == lp - 1) );
236 double ForbiddenHe[5] = { 1.272E-4, 1E-20, 1E-20, 177.58, 0.327 };
238 A = ForbiddenHe[ipHi - 1];
253 A = (3.9061E-7) * pow( (
double)nelem+1., 10.419 );
266 A = ( 11.431 * pow((
double)nelem, 9.091) );
271 A = ( 383.42 * pow((
double)nelem, 7.8901) );
279 A = ( 0.11012 * pow((
double)nelem, 7.6954) );
298 else if( nelem>
ipHELIUM &&
L_(ipHi)==1 &&
S_(ipHi)==3 &&
299 L_(ipLo)==0 &&
S_(ipLo)==1 &&
N_(ipLo) <
N_(ipHi) )
301 A = 8.0E-3 * exp(9.283/sqrt((
double)
N_(ipLo))) * pow((
double)nelem,9.091) /
302 pow((
double)
N_(ipHi),2.877);
307 else if( nelem >
ipHELIUM &&
L_(ipHi)==0 &&
S_(ipHi)==1 &&
308 L_(ipLo)==1 &&
S_(ipLo)==3 &&
N_(ipLo) <
N_(ipHi) )
310 A = 2.416 * exp(-0.256*
N_(ipLo)) * pow((
double)nelem,9.159) / pow((
double)
N_(ipHi),3.111);
316 A *= (2.*(ipLo-3)+1.0)/3.0;
323 double As_3TripS_to_2TripS[9] = {
324 7.86E-9, 4.59E-6, 1.90E-4, 2.76E-3, 2.25E-2,
325 1.27E-1, 5.56E-1, 2.01E0, 6.26E0 };
331 A = As_3TripS_to_2TripS[nelem-1];
340 A= 7.22E-9*pow((
double)nelem, 9.33);
358 A= 0.1834*pow((
double)nelem, 6.5735);
363 else if( nelem==
ipHELIUM && ipHi==4 && ipLo==3 )
377 else if( nelem==
ipHELIUM && ipHi==5 && ipLo==4 )
392 A = 44.326 * (1./3.) + 0.1146547 * (5./9.);
399 A = 1.459495 * (1./3.) + 3.6558e-5 * (5./9.);
406 A = 2.2297e-3 * (1./3.);
424 else if( ( ipLo==0 &&
L_(ipHi)==2 &&
S_(ipHi)==1 ) ||
427 (
N_(ipLo)==2 &&
L_(ipLo)==1 &&
S_(ipLo)==3 &&
N_(ipHi)>=3 &&
L_(ipHi)==1 &&
S_(ipHi)==3 ) ||
432 double f_params[5][4][3] = {
434 {9.360591E-007, -3.1937E-006, 3.5186E-006},
435 {4.631435E-007, -1.4973E-006, 1.4848E-006},
436 {2.493912E-007, -7.8658E-007, 7.3994E-007},
437 {1.476742E-007, -4.5953E-007, 4.1932E-007}},
439 {1.646733E-006, -2.0028E-006, -1.3552E-006},
440 {9.120593E-008, 3.1301E-007, -3.2190E-007},
441 {1.360965E-008, 1.1467E-007, 8.6977E-008},
442 {3.199421E-009, 4.5485E-008, 1.1016E-007}},
444 {1.646733E-006, -2.9720E-006, 1.5367E-006},
445 {9.120593E-008, -3.9037E-008, 3.9156E-008},
446 {1.360965E-008, 1.4671E-008, 1.5626E-008},
447 {3.199421E-009, 8.9806E-009, 1.2436E-008}},
449 {1.543812E-007, -2.8220E-007, 3.0261E-008},
450 {3.648237E-008, -6.6824E-008, 4.5879E-009},
451 {1.488556E-008, -2.7304E-008, 1.6628E-009},
452 {7.678610E-009, -1.4112E-008, 6.8453E-010}},
454 {1.543812E-007, -2.8546E-007, 4.6605E-008},
455 {3.648237E-008, -6.8422E-008, 1.7038E-008},
456 {1.488556E-008, -2.8170E-008, 8.5012E-009},
457 {7.678610E-009, -1.4578E-008, 4.6686E-009}}
470 long index_hi =
MIN2(
N_(ipHi), 6 ) - 3;
471 double f_lu =
POW2(nelem+1) * (
472 f_params[index_lo][index_hi][0] +
473 f_params[index_lo][index_hi][1]/(nelem+1) +
474 f_params[index_lo][index_hi][2]/
POW2(nelem+1) );
478 f_lu *= pow( 6. /
N_(ipHi), 3. );
484 A =
eina( gLo * f_lu, eWN, gHi );
503 long nelem ,
double Enerwn ,
505 double Eff_nupper,
long lHi,
long sHi,
long jHi,
507 double Eff_nlower,
long lLo,
long sLo,
long jLo )
513 long nHi, nLo, ipHi, ipLo;
521 nHi = (int)(Eff_nupper + 0.4);
522 nLo = (int)(Eff_nlower + 0.4);
525 ASSERT( fabs(Eff_nupper-(
double)nHi) < 0.4 );
526 ASSERT( fabs(Eff_nlower-(
double)nLo) < 0.4 );
529 if( (nHi==2) && (lHi==1) && (sHi==3) )
531 ASSERT( (jHi>=0) && (jHi<=2) );
536 if( (nLo==2) && (lLo==1) && (sLo==3) )
538 ASSERT( (jLo>=0) && (jLo<=2) );
556 if( (sHi == sLo) && (abs((
int)(lHi - lLo)) == 1) )
582 ASSERT( (lHi == 1) && (sHi == 1) );
586 Aul = (1.59208e10) / pow(Eff_nupper,3.0);
593 else if( lHi>=2 && lLo>=2 && nHi>nLo )
605 else if(
N_(ipHi)>10 &&
N_(ipLo)<=5 && lHi<=2 && lLo<=2 )
608 double emisOscStr, x, a, b, c;
609 double extrapol_Params[2][4][4][3] = {
613 { 0.8267396 , 1.4837624 , -0.4615955 },
614 { 1.2738405 , 1.5841806 , -0.3022984 },
615 { 1.6128996 , 1.6842538 , -0.2393057 },
616 { 1.8855491 , 1.7709125 , -0.2115213 }},
618 { -1.4293664 , 2.3294080 , -0.0890470 },
619 { -0.3608082 , 2.3337636 , -0.0712380 },
620 { 0.3027974 , 2.3326252 , -0.0579008 },
621 { 0.7841193 , 2.3320138 , -0.0497094 }},
623 { 1.1341403 , 3.1702435 , -0.2085843 },
624 { 1.7915926 , 2.4942946 , -0.2266493 },
625 { 2.1979400 , 2.2785377 , -0.1518743 },
626 { 2.5018229 , 2.1925720 , -0.1081966 }},
628 { 0.0000000 , 0.0000000 , 0.0000000 },
629 { -2.6737396 , 2.9379143 , -0.3805367 },
630 { -1.4380124 , 2.7756396 , -0.2754625 },
631 { -0.6630196 , 2.6887253 , -0.2216493 }},
636 { 0.3075287 , 0.9087130 , -1.0387207 },
637 { 0.687069 , 1.1485864 , -0.6627317 },
638 { 0.9776064 , 1.3382024 , -0.5331906 },
639 { 1.2107725 , 1.4943721 , -0.4779232 }},
641 { -1.3659605 , 2.3262253 , -0.0306439 },
642 { -0.2899490 , 2.3279391 , -0.0298695 },
643 { 0.3678878 , 2.3266603 , -0.0240021 },
644 { 0.8427457 , 2.3249540 , -0.0194091 }},
646 { 1.3108281 , 2.8446367 , -0.1649923 },
647 { 1.8437692 , 2.2399326 , -0.2583398 },
648 { 2.1820792 , 2.0693762 , -0.1864091 },
649 { 2.4414052 , 2.0168255 , -0.1426083 }},
651 { 0.0000000 , 0.0000000 , 0.0000000 },
652 { -1.9219877 , 2.7689624 , -0.2536072 },
653 { -0.7818065 , 2.6595150 , -0.1895313 },
654 { -0.0665624 , 2.5955623 , -0.1522616 }},
662 else if( lLo==1 && lHi==0 )
666 else if( lLo==1 && lHi==2 )
676 ASSERT( (
int)((sHi-1)/2) == 0 || (
int)((sHi-1)/2) == 1 );
677 a = extrapol_Params[(int)((sHi-1)/2)][paramSet][nLo-2][0];
678 b = extrapol_Params[(int)((sHi-1)/2)][paramSet][nLo-2][1];
679 c = extrapol_Params[(int)((sHi-1)/2)][paramSet][nLo-2][2];
683 emisOscStr = exp(a+b*x+c*x*x)/pow(Eff_nupper,3.)*
684 (2.*lLo+1)/(2.*lHi+1);
690 Aul *= (2.*(ipLo-3)+1.0)/9.0;
707 Aul *= (2.*(ipLo-3)+1.0)/9.0;
736 if( nLo==nHi && lHi<=2 && lLo<=2 )
743 Aul = 3.31E7 + 1.13E6 * pow((
double)nelem+1.,1.76);
745 Aul = 2.73E7 + 1.31E6 * pow((
double)nelem+1.,1.76);
747 Aul = 3.68E7 + 1.04E7 * exp(((
double)nelem+1.)/5.29);
750 fprintf(
ioQQQ,
" PROBLEM Impossible value for ipHi in he_1trans.\n");
758 Aul = 5.53E6 * exp( 0.171*(nelem+1.) );
767 if( (lHi == 1) && (sHi == 3) && (lLo == 0) && (sLo == 3))
769 Aul = 0.4 * 3.85E8 * pow((
double)nelem,1.6)/pow((
double)nHi,5.328);
772 else if( (lHi == 1) && (sHi == 1) && (lLo == 2) && (sLo == 1))
774 Aul = 1.95E4 * pow((
double)nelem,1.6) / pow((
double)nHi, 4.269);
777 else if( (lHi == 1) && (sHi == 1) && (lLo == 0) )
779 Aul = 6.646E7 * pow((
double)nelem,1.5) / pow((
double)nHi, 5.077);
783 ASSERT( (lHi == 2) && (sHi == 3) && (lLo == 1) );
784 Aul = 3.9E6 * pow((
double)nelem,1.6) / pow((
double)nHi, 4.9);
785 if( (lHi >2) || (lLo > 2) )
795 else if( (nHi > nLo) && ((lHi > 2) || (lLo > 2)) )
806 || ( ipLo ==
ipHe3s3S ) || ( nLo==4 && lLo==0 && sLo==3 ) )
811 ASSERT( (lHi == 1) && (sHi == 1) );
818 Aul = 1.375E10 * pow((
double)nelem, 3.9) / pow((
double)nHi,3.1);
824 ASSERT( (lHi == 1) && (sHi == 1) );
827 Aul = 5.0e8 * pow((
double)nelem,4.) / pow((
double)nHi, 2.889);
833 ASSERT( (lHi == 1) && (sHi == 3) );
837 Aul = 1.5 * 3.405E8 * pow((
double)nelem,4.) / pow((
double)nHi, 2.883);
839 Aul = 2.5 * 4.613E7 * pow((
double)nelem,4.) / pow((
double)nHi, 2.672);
841 Aul = 3.0 * 1.436E7 * pow((
double)nelem,4.) / pow((
double)nHi, 2.617);
851 RI2 =
scqdri(Eff_nupper,lHi,Eff_nlower,lLo,(
double)(nelem));
853 Aul =
ritoa(lHi,lLo,nelem,Enerwn,RI2);
858 Aul *= (2.*(ipLo-3)+1.0)/9.0;
876 ASSERT( (sHi != sLo) || (abs((
int)(lHi - lLo)) != 1) );
888 fprintf(
ioQQQ,
" he_1trans hit negative energy, nelem=%li, val was %f \n", nelem ,Enerwn );
903 long int nHi, lHi, sHi, nLo, lLo, sLo, ipHiTrip, ipLoTrip;
904 double Ass, Att, Ast, Ats;
905 double SinHi, SinLo, CosHi, CosLo;
906 double HiMixingAngle, LoMixingAngle , error;
907 double Kss, Ktt, Kts, Kst, fss, ftt, fssNew, fttNew, ftsNew, fstNew, temp;
918 if( ( sHi == 3 || sLo == 3 ) ||
919 ( abs(lHi - lLo) != 1 ) ||
921 ( lHi <= 1 || lLo <= 1 ) ||
922 ( nHi == nLo && lHi == 1 && lLo == 2 ) ||
923 ( nHi > nLo && lHi != 1 && lLo != 1 ) )
936 HiMixingAngle = 0.01;
944 HiMixingAngle =
PI/4.;
949 LoMixingAngle = 0.01;
957 LoMixingAngle =
PI/4.;
961 ASSERT( ipHiTrip > ipLoTrip );
962 ASSERT( ipHiTrip > ipLoSing );
963 ASSERT( ipHiSing > ipLoTrip );
964 ASSERT( ipHiSing > ipLoSing );
966 SinHi = sin( HiMixingAngle );
967 SinLo = sin( LoMixingAngle );
968 CosHi = cos( HiMixingAngle );
969 CosLo = cos( LoMixingAngle );
982 temp = sqrt(fss/Kss)*CosHi*CosLo + sqrt(ftt/Ktt)*SinHi*SinLo;
983 fssNew = Kss*
POW2( temp );
984 temp = sqrt(fss/Kss)*SinHi*SinLo + sqrt(ftt/Ktt)*CosHi*CosLo;
985 fttNew = Ktt*
POW2( temp );
986 temp = sqrt(fss/Kss)*CosHi*SinLo - sqrt(ftt/Ktt)*SinHi*CosLo;
987 fstNew = Kst*
POW2( temp );
988 temp = sqrt(fss/Kss)*SinHi*CosLo - sqrt(ftt/Ktt)*CosHi*SinLo;
989 ftsNew = Kts*
POW2( temp );
1003 error = fabs( (
iso_sp[
ipHE_LIKE][nelem].trans(ipHiSing,ipLoSing).Emis().Aul()+
1005 (Ass+Ast+Ats+Att) - 1.f );
1009 fprintf(
ioQQQ,
"FSM error %e LS %li HS %li LT %li HT %li Ratios Ass %e Att %e Ast %e Ats %e\n", error,
1010 ipLoSing, ipHiSing, ipLoTrip, ipHiTrip,
1027STATIC double ritoa(
long li,
long lf,
long nelem,
double k,
double RI2)
1038 double fmean,mu,EinsteinA,w,RI2_cm;
1048 lg = (lf > li) ? lf : li;
1050 fmean = 2.0*mu*w*lg*RI2_cm/((3.0*
H_BAR) * (2.0*li+1.0));
1062 double Enerwn, n_eff_hi, n_eff_lo;
1065 double z4 =
POW2((
double)nelem);
1074 if( ipHi >=
iso_sp[ipISO][nelem].numLevels_max-
iso_sp[ipISO][nelem].nCollapsed_max )
1076 if( ipLo >=
iso_sp[ipISO][nelem].numLevels_max-
iso_sp[ipISO][nelem].nCollapsed_max )
1088 Aul =
he_1trans( nelem, Enerwn, n_eff_hi,
L_(ipLo)+1,
1089 S_(ipLo), -1, n_eff_lo,
L_(ipLo),
S_(ipLo), ipLo-3);
1093 Aul *= (2.*
L_(ipLo)+3.) *
S_(ipLo) / (4.*(double)
N_(ipHi)*(double)
N_(ipHi));
1098 Aul1 =
he_1trans( nelem, Enerwn, n_eff_hi,
L_(ipLo)-1,
1099 S_(ipLo), -1, n_eff_lo,
L_(ipLo),
S_(ipLo), ipLo-3);
1104 Aul += Aul1*(2.*
L_(ipLo)-1.) *
S_(ipLo) / (4.*(double)
N_(ipHi)*(double)
N_(ipHi));
1118 Aul =
he_1trans( nelem, -1.*Enerwn, n_eff_lo,
1119 L_(ipLo),
S_(ipLo), ipLo-3, n_eff_hi,
L_(ipHi),
S_(ipHi), ipHi-3);
1123 Aul =
he_1trans( nelem, Enerwn, n_eff_hi,
1124 L_(ipHi),
S_(ipHi), ipHi-3, n_eff_lo,
L_(ipLo),
S_(ipLo), ipLo-3);
1141 long nelem, ipLo, ipHi, i, i1, i2, i3;
1161 fprintf(
ioQQQ,
" HelikeTransProbSetup opening he_transprob.dat:");
1163 ioDATA =
open_data(
"he_transprob.dat",
"r" );
1166 if(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) == NULL )
1168 fprintf(
ioQQQ,
" HelikeTransProbSetup could not read first line of he_transprob.dat.\n");
1172 i1 = (long)
FFmtRead(chLine,&i,
sizeof(chLine),&lgEOL);
1173 i2 = (long)
FFmtRead(chLine,&i,
sizeof(chLine),&lgEOL);
1177 " HelikeTransProbSetup: the version of he_transprob.dat is not the current version.\n" );
1179 " HelikeTransProbSetup: I expected to find the number %i %i and got %li %li instead.\n" ,
1181 fprintf(
ioQQQ,
"Here is the line image:\n==%s==\n", chLine );
1202 if(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) == NULL )
1205 while( chLine[0]==
'#' )
1207 if(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) == NULL )
1212 i1 = (long)
FFmtRead(chLine,&i3,
sizeof(chLine),&lgEOL);
1213 i2 = (long)
FFmtRead(chLine,&i3,
sizeof(chLine),&lgEOL);
1215 if( i1<0 || i2<=i1 )
1217 fprintf(
ioQQQ,
" HelikeTransProbSetup detected insanity in he_transprob.dat.\n");
1224 for( i=0; i<1; ++i )
1226 if( (chTemp =
strchr_s( chTemp,
'\t' )) == NULL )
1228 fprintf(
ioQQQ,
" HelikeTransProbSetup could not init he_transprob\n" );
1237 if( (chTemp =
strchr_s( chTemp,
'\t' )) == NULL )
1239 fprintf(
ioQQQ,
" HelikeTransProbSetup could not scan he_transprob\n" );
1244 sscanf( chTemp ,
"%le" , &
TransProbs[nelem][i2][i1] );
1249 fprintf(
ioQQQ,
" HelikeTransProbSetup detected insanity in he_transprob.dat.\n");
1256 if(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) == NULL )
1258 fprintf(
ioQQQ,
" HelikeTransProbSetup could not read last line of he_transprob.dat.\n");
1262 i1 = (long)
FFmtRead(chLine,&i,
sizeof(chLine),&lgEOL);
1263 i2 = (long)
FFmtRead(chLine,&i,
sizeof(chLine),&lgEOL);
1267 " HelikeTransProbSetup: the version of he_transprob.dat is not the current version.\n" );
1269 " HelikeTransProbSetup: I expected to find the number %i %i and got %li %li instead.\n" ,
1271 fprintf(
ioQQQ,
"Here is the line image:\n==%s==\n", chLine );
double qg32(double, double, double(*)(double))
NORETURN void BadRead(void)
double FFmtRead(const char *chCard, long int *ipnt, long int last, bool *lgEOL)
const char * strchr_s(const char *s, int c)
char * read_whole_line(char *chLine, int nChar, FILE *ioIN)
NORETURN void TotalInsanity(void)
#define DEBUG_ENTRY(funcname)
realnum & EnergyWN() const
qList::iterator Lo() const
qList::iterator Hi() const
EmissionList::reference Emis() const
multi_arr< realnum, 3 > CachedAs
TransitionProxy trans(const long ipHi, const long ipLo)
long int n_HighestResolved_max
multi_arr< long, 3 > QuantumNumbers2Index
FILE * open_data(const char *fname, const char *mode, access_scheme scheme)
double helike_quantum_defect(long int nelem, long int ipLev)
void DoFSMixing(long nelem, long ipLoSing, long ipHiSing)
STATIC double Jint(double theta)
STATIC double AngerJ(double vv, double zz)
void HelikeTransProbSetup(void)
double scqdri(double nstar, long int l, double npstar, long int lp, double iz)
STATIC double ForbiddenAuls(long ipHi, long ipLo, long nelem)
double he_1trans(long nelem, double Enerwn, double Eff_nupper, long lHi, long sHi, long jHi, double Eff_nlower, long lLo, long sLo, long jLo)
static double *** TransProbs
STATIC double ritoa(long li, long lf, long nelem, double k, double RI2)
realnum helike_transprob(long nelem, long ipHi, long ipLo)
double H_Einstein_A(long int n, long int l, long int np, long int lp, long int iz)
double HydroEinstA(long int n1, long int n2)
t_iso_sp iso_sp[NISO][LIMELM]
void iso_put_error(long ipISO, long nelem, long ipHi, long ipLo, long whichData, realnum errorOpt, realnum errorPess)
double eina(double gf, double enercm, double gup)
UNUSED const double H_BAR
UNUSED const double TRANS_PROB_CONST
UNUSED const double BOHR_RADIUS_CM
UNUSED const double SPEEDLIGHT
UNUSED const double ELECTRON_MASS
UNUSED const double RYD_INF
UNUSED const double ATOMIC_MASS_UNIT
realnum AtomicWeight[LIMELM]