26 STATIC double Hydcs123(
long int ilow,
long int ihigh,
long int iz,
long int chType);
35 inline double C2_PR78(
double x,
double y);
41 static const realnum HCSTE[
NHCSTE] = {5802.f,11604.f,34812.f,58020.f,116040.f,174060.f,232080.f,290100.f};
52 if( ipLo==1 && ipHi==2 )
54 fprintf(
ioQQQ,
"HCSAR_interp was called for the 2s-2p transition, which it cannot do\n");
71 for( ip=1; ip<
NHCSTE; ++ip )
83 fprintf(
ioQQQ,
" insane cs returned by HCSAR_interp, values are\n");
132 static const double ap[5] = {-2113.113,729.0084,1055.397,854.632,938.9912};
133 static const double bp[5] = {-6783.515,-377.7190,724.1936,493.1107,735.7466};
134 static const double cp[5] = {-3049.719,226.2320,637.8630,388.5465,554.6369};
135 static const double dp[5] = {3514.5153,88.60169,-470.4055,-329.4914,-450.8459};
136 static const double ep[5] = {0.005251557,0.009059154,0.008725781,0.009952418,0.01098687};
137 static const double ae[5] = {-767.5859,-643.1189,-461.6836,-429.0543,-406.5285};
138 static const double be[5] = {-1731.9178,-1442.548,-1055.364,-980.3079,-930.9266};
139 static const double ce[5] = {-939.1834,-789.9569,-569.1451,-530.1974,-502.0939};
140 static const double de[5] = {927.4773,773.2008,564.3272,524.2944,497.7763};
141 static const double ee[5] = {-0.002528027,-0.003793665,-0.002122103,-0.002234207,-0.002317720};
142 static const double A[2] = {4.4394,0.0};
143 static const double B[2] = {0.8949,0.8879};
144 static const double C0[2] = {-0.6012,-0.2474};
145 static const double C1[2] = {-3.9710,-3.7562};
146 static const double C2[2] = {-4.2176,2.0491};
147 static const double D0[2] = {2.930,0.0539};
148 static const double D1[2] = {1.7990,3.4009};
149 static const double D2[2] = {4.9347,-1.7770};
248 else if( ipLow == 2 )
254 else if( ipLow == 3 )
266 Charge = (double)(nelem + 1);
268 ChargeSquared = Charge*Charge;
270 if( ipLow == 2 && ipHi == 3 )
281 else if( nelem == 1 )
289 else if( nelem <= 5 )
296 else if( nelem <= 11 )
303 else if( nelem <= 15 )
310 else if( nelem <= 17 )
331 TeUse =
MIN2(x,0.80);
332 x =
MAX2(0.025,TeUse);
339 Ratelow = ae[j-1] + be[j-1]*x + ce[j-1]*
pow2(x)*logx + de[j-1]*
340 exp(x) + ee[j-1]*logx/
pow2(x);
342 else if( chType ==
'p' )
344 Ratelow = ap[j-1] + bp[j-1]*x + cp[j-1]*
pow2(x)*logx + dp[j-1]*
345 exp(x) + ep[j-1]*logx/
pow2(x);
350 fprintf(
ioQQQ,
" insane collision species given to Hydcs123\n" );
362 TeUse =
MIN2(x,0.80);
363 x =
MAX2(0.025,TeUse);
367 Ratehigh = ae[k-1] + be[k-1]*x + ce[k-1]*
pow2(x)*logx +
368 de[k-1]*exp(x) + ee[k-1]*logx/
pow2(x);
372 Ratehigh = ap[k-1] + bp[k-1]*x + cp[k-1]*
pow2(x)*logx +
373 dp[k-1]*exp(x) + ep[k-1]*logx/
pow2(x);
376 slope = (Ratehigh - Ratelow)/(zhigh - zlow);
377 rate = slope*(Charge - zlow) + Ratelow;
379 rate = rate/ChargeSquared/Charge*1.0e-7;
381 templow = 0.025*27.211396*TE1RYD/EVRYD*ChargeSquared;
382 temphigh = 0.80*27.211396*TE1RYD/EVRYD*ChargeSquared;
384 temp =
MAX2(TeUse,templow);
385 Hydcs123_v = rate*gHi*sqrt(temp)/COLL_CONST;
390 Hydcs123_v *=
powpq( PROTON_MASS/ELECTRON_MASS, 3, 2 );
393 else if( ipHi == 4 || ipHi == 5 || ipHi == 6 )
402 else if( nelem == 1 )
409 else if( nelem > 1 && nelem <= 5 )
414 Ratehigh =
C6cs123(ipLow,ipHi);
416 else if( nelem > 5 && nelem <= 9 )
423 else if( nelem > 9 && nelem <= 19 )
430 else if( nelem > 19 && nelem <= 25 )
455 slope = (Ratehigh - Ratelow)/(zhigh - zlow);
456 rate = slope*(Charge - zlow) + Ratelow;
473 return( Hydcs123_v );
479 EE = ChargeSquared*EVRYD*(1./QuanNLo/QuanNLo - 1./QuanNUp/QuanNUp);
489 C = C0[i] + C1[i]/Charge + C2[i]/ChargeSquared;
490 D = D0[i] + D1[i]/Charge + D2[i]/ChargeSquared;
516 rate = (B[i] + D*q)/expq + (A[i] + C*q - D*q*q)*
521 rate *= 8.010e-8/(2. * ChargeSquared * sqrt(tev));
523 rate *= expq*gLo/gHi;
528 return( Hydcs123_v );
540 static const double a[3] = {-92.23774,-1631.3878,-6326.4947};
541 static const double b[3] = {-11.93818,-218.3341,-849.8927};
542 static const double c[3] = {0.07762914,1.50127,5.847452};
543 static const double d[3] = {78.401154,1404.8475,5457.9291};
544 static const double e[3] = {332.9531,5887.4263,22815.211};
561 t =
MIN2(TeUse,1.6e6);
565 if( i == 1 && j == 2 )
568 fprintf(
ioQQQ,
" Carbon VI 2s-1s not done in C6cs123\n" );
572 else if( i == 1 && j == 3 )
575 fprintf(
ioQQQ,
" Carbon VI 2p-1s not done in C6cs123\n" );
579 else if( i == 1 && ( j == 4 || j == 5 || j == 6 ) )
582 C6cs123_v = a[0] + b[0]*x + c[0]*
pow2(x)*sqrt(x) + d[0]*logx +
585 else if( i == 2 && ( j == 4 || j == 5 || j == 6 ) )
588 C6cs123_v = a[1] + b[1]*x + c[1]*
pow2(x)*sqrt(x) + d[1]*logx +
591 else if( i == 3 && ( j == 4 || j == 5 || j == 6 ) )
594 C6cs123_v = a[2] + b[2]*x + c[2]*
pow2(x)*sqrt(x) + d[2]*logx +
599 fprintf(
ioQQQ,
" insane levels for C VI n=1,2,3 !!!\n" );
614 static const double a[3] = {-12.5007,-187.2303,-880.18896};
615 static const double b[3] = {-1.438749,-22.17467,-103.1259};
616 static const double c[3] = {0.008219688,0.1318711,0.6043752};
617 static const double d[3] = {10.116516,153.2650,717.4036};
618 static const double e[3] = {45.905343,685.7049,3227.2836};
637 t =
MIN2(TeUse,1.585e7);
641 if( i == 1 && j == 2 )
644 fprintf(
ioQQQ,
" Ca XX 2s-1s not done in Ca20cs123\n" );
648 else if( i == 1 && j == 3 )
651 fprintf(
ioQQQ,
" Ca XX 2p-1s not done in Ca20cs123\n" );
655 else if( i == 1 && ( j == 4 || j == 5 || j == 6 ))
658 Ca20cs123_v = a[0] + b[0]*x + c[0]*
pow2(x)*sqrt(x) + d[0]*logx +
661 else if( i == 2 && ( j == 4 || j == 5 || j == 6 ))
664 Ca20cs123_v = a[1] + b[1]*x + c[1]*
pow2(x)*sqrt(x) + d[1]*logx +
667 else if( i == 3 && ( j == 4 || j == 5 || j == 6 ))
670 Ca20cs123_v = a[2] + b[2]*x + c[2]*
pow2(x)*sqrt(x) + d[2]*logx +
675 fprintf(
ioQQQ,
" insane levels for Ca XX n=1,2,3 !!!\n" );
678 return( Ca20cs123_v );
690 static const double a[3] = {3.346644,151.2435,71.7095};
691 static const double b[3] = {0.5176036,20.05133,13.1543};
692 static const double c[3] = {-0.00408072,-0.1311591,-0.1099238};
693 static const double d[3] = {-3.064742,-129.8303,-71.0617};
694 static const double e[3] = {-11.87587,-541.8599,-241.2520};
711 t =
MIN2(TeUse,1.6e6);
715 if( i == 1 && j == 2 )
718 fprintf(
ioQQQ,
" Neon X 2s-1s not done in Ne10cs123\n" );
722 else if( i == 1 && j == 3 )
725 fprintf(
ioQQQ,
" Neon X 2p-1s not done in Ne10cs123\n" );
729 else if( i == 1 && ( j == 4 || j == 5 || j == 6 ) )
732 Ne10cs123_v = a[0] + b[0]*x + c[0]*
pow2(x)*sqrt(x) + d[0]*logx +
735 else if( i == 2 && ( j == 4 || j == 5 || j == 6 ) )
738 Ne10cs123_v = a[1] + b[1]*x + c[1]*
pow2(x)*sqrt(x) + d[1]*logx +
741 else if( i == 3 && ( j == 4 || j == 5 || j == 6 ) )
744 Ne10cs123_v = a[2] + b[2]*x + c[2]*
pow2(x)*sqrt(x) + d[2]*logx +
749 fprintf(
ioQQQ,
" insane levels for Ne X n=1,2,3 !!!\n" );
752 return( Ne10cs123_v );
761 static const double a[11]={0.12176209,0.32916723,0.46546497,0.044501688,
762 0.040523277,0.5234889,1.4903214,1.4215094,1.0295881,4.769306,9.7226127};
763 static const double b[11]={0.039936166,2.9711166e-05,-0.020835863,3.0508137e-04,
764 -2.004485e-15,4.41475e-06,1.0622666e-05,2.0538877e-06,0.80638448,2.0967075e-06,
766 static const double c[11]={143284.77,0.73158545,-2.159172,0.43254802,2.1338557,
767 8.9899702e-06,-2.9001451e-12,1.762076e-05,52741.735,-2153.1219,-3.3996921e-11};
789 else if( t > 5.0e05 )
796 if( i == 1 && j == 2 )
799 He2cs123_v = a[0] + b[0]*exp(-t/c[0]);
801 else if( i == 1 && j == 3 )
804 He2cs123_v = a[1] + b[1]*
pow(t,c[1]);
806 else if( i == 1 && j == 4 )
809 double logt = log(t);
810 He2cs123_v = a[2] + b[2]*logt + c[2]/logt;
812 else if( i == 1 && j == 5 )
815 He2cs123_v = a[3] + b[3]*
pow(t,c[3]);
817 else if( i == 1 && j == 6 )
820 He2cs123_v = a[4] + b[4]*
pow(t,c[4]);
822 else if( i == 2 && j == 4 )
825 He2cs123_v = (a[5] + c[5]*t)/(1 + b[5]*t);
827 else if( i == 2 && j == 5 )
830 He2cs123_v = a[6] + b[6]*t + c[6]*t*t;
832 else if( i == 2 && j == 6 )
835 He2cs123_v = (a[7] + c[7]*t)/(1 + b[7]*t);
837 else if( i == 3 && j == 4 )
840 He2cs123_v = a[8] + b[8]*exp(-t/c[8]);
842 else if( i == 3 && j == 5 )
845 He2cs123_v = a[9] + b[9]*t + c[9]/t;
847 else if( i == 3 && j == 6 )
850 He2cs123_v = a[10] + b[10]*t + c[10]*t*t;
855 fprintf(
ioQQQ,
" insane levels for He II n=1,2,3 !!!\n" );
858 return( He2cs123_v );
870 static const double a[3] = {-4.238398,-238.2599,-1211.5237};
871 static const double b[3] = {-0.4448177,-27.06869,-136.7659};
872 static const double c[3] = {0.0022861,0.153273,0.7677703};
873 static const double d[3] = {3.303775,191.7165,972.3731};
874 static const double e[3] = {15.82689,878.1333,4468.696};
891 t =
MIN2(TeUse,1.585e7);
895 if( i == 1 && j == 2 )
898 fprintf(
ioQQQ,
" Fe XXVI 2s-1s not done in Fe26cs123\n" );
902 else if( i == 1 && j == 3 )
905 fprintf(
ioQQQ,
" Fe XXVI 2p-1s not done in Fe26cs123\n" );
909 else if( i == 1 && ( j == 4 || j == 5 || j == 6 ) )
912 Fe26cs123_v = a[0] + b[0]*x + c[0]*
pow2(x)*sqrt(x) + d[0]*logx +
915 else if( i == 2 && ( j == 4 || j == 5 || j == 6 ) )
918 Fe26cs123_v = a[1] + b[1]*x + c[1]*
pow2(x)*sqrt(x) + d[1]*logx +
921 else if( i == 3 && ( j == 4 || j == 5 || j == 6 ) )
924 Fe26cs123_v = a[2] + b[2]*x + c[2]*
pow2(x)*sqrt(x) + d[2]*logx +
929 fprintf(
ioQQQ,
" insane levels for Ca XX n=1,2,3 !!!\n" );
932 return( Fe26cs123_v );
949 kTRyd = temp / TE1RYD;
980 return pow2(x)*log1p(2./3.*x)/(2.*y + 1.5*x);
996 double Ebar2 =
pow2(Ebar);
1002 double A = 8./(3.*s) *
pow3(np/(s*n)) * (0.184 - 0.04/
pow2(cbrt(s))) *
powi(1.-0.2*s/nnp, 1+2*is);
1004 double Z3 = (double)(nelem + 1 - ipISO);
1005 double Z32 =
pow2(Z3);
1007 double D = exp(-Z32/(nnp*Ebar2));
1009 double L = log((1.+0.53*Ebar2*nnp/Z32) / (1.+0.4*Ebar));
1011 double F =
powi(1.-0.3*s*D/nnp, 1+2*is);
1013 double G = 0.5*
pow3(Ebar*n2/(Z3*np));
1015 double h1 = sqrt(2. -
pow2(n/np));
1016 double h2 = 2.*Z3/(n2*Ebar);
1017 double xPlus = h2/(h1+1.);
1018 double xMinus = h2/(h1-1.);
1020 double y = 1./(1.-D*log(18.*s)/(4.*s));
1027 cross_section *= PI*
pow2(n2*BOHR_RADIUS_CM/Z3) / Ebar;
1031 stat_weight = 2.*n2;
1033 stat_weight = 4.*n2;
1038 return cross_section*stat_weight*Ebar / (PI*
pow2(BOHR_RADIUS_CM));
1042 STATIC void TestPercivalRichards(
void )
1047 for(
long i=0; i<5; i++ )
1049 double Ebar[5] = {0.1, 0.4, 0.8, 1.0, 10.};
1055 for(
long i=0; i<5; i++ )
1057 double Ebar[5] = {0.1, 0.4, 0.8, 1.0, 10.};
1089 nHi, lHi, sHi, gHi, IP_Ryd_Hi,
1090 nLo, lLo, sLo, gLo, IP_Ryd_Lo,
1091 Aul, tauLo, EnerErg );
1096 long nHi,
long lHi,
long sHi,
long gHi,
double IP_Ryd_Hi,
1097 long nLo,
long lLo,
long sLo,
long gLo,
double IP_Ryd_Lo,
1098 double Aul,
double tauLo,
double EnerErg )
1108 double deltaE_eV = EnerErg/EN1EV;
1117 abs( lLo - lHi ) != 1 )
1160 abs( lLo - lHi ) != 1 )
1170 CStemp /= 2.*
pow2(nHi);
1180 if( (CStemp =
HlikeCSInterp( nelem, ipCollider, nHi, lHi, sHi, nLo, lLo, sLo )) >= 0.f )
1182 fixit(
"do something here and throughout this routine with where as in helike_cs.cpp." );
1187 CStemp =
hydro_vs_deexcit( nHi, gHi, IP_Ryd_Hi, nLo, gLo, IP_Ryd_Lo, Aul );
1190 CStemp /= 2.*
pow2(nHi);
1192 else if( nLo == nHi )
1278 CStemp /= 2.*
pow2(nHi);
1291 if( lLo < 0 || lHi < 0 )
1294 ASSERT( sHi==2 && sLo==2 );
1307 cs =
Hydcs123(ipLo + 1,ipHi + 1,nelem,
'e');
1309 else if( nelem>
ipHYDROGEN && Collider==
ipPROTON && nHi==2 && lHi==1 && nLo==2 && lLo==0 )
1311 cs =
Hydcs123(ipLo + 1,ipHi + 1,nelem,
'p');
realnum GetHlikeCollisionStrength(long nelem, long ipCollider, long nHi, long lHi, long sHi, long gHi, double IP_Ryd_Hi, long nLo, long lLo, long sLo, long gLo, double IP_Ryd_Lo, double Aul, double tauLo, double EnerErg)
realnum EnergyErg() const
STATIC double Ne10cs123(long int i, long int j)
bool lgCS_PSClassic[NISO]
NORETURN void TotalInsanity(void)
realnum h_coll_str(long ipLo, long ipHi, long ipTe)
bool lgCS_therm_ave[NISO]
double CS_l_mixing_VF01(long ipISO, long nelem, long n, long l, long lp, long s, long gLo, double tauLo, double IP_Ryd_Hi, double IP_Ryd_Lo, double temp, long Collider)
STATIC double Fe26cs123(long int i, long int j)
double C2_PR78(double x, double y)
double CS_l_mixing_PS64(long nelem, double tau, double target_charge, long n, long l, double gLo, long lp, double deltaE_eV, long Collider)
bool lgCS_Vrinceanu[NISO]
STATIC double Hydcs123(long int ilow, long int ihigh, long int iz, long int chType)
t_iso_sp iso_sp[NISO][LIMELM]
STATIC double CS_ThermAve_PR78(long ipISO, long nelem, long nHi, long nLo, double deltaE, double temp)
bool fp_equal(sys_float x, sys_float y, int n=3)
realnum HydroCSInterp(long nelem, long ipHi, long ipLo, long ipCollider)
double CS_l_mixing_VOS12(long n, long l, long lp, long nelem, double gLo, long Ztarget, long Collider, double sqrte)
STATIC realnum HCSAR_interp(int ipLo, int ipHi)
static const realnum HCSTE[NHCSTE]
STATIC double He2cs123(long int i, long int j)
EmissionList::reference Emis() const
STATIC double CS_PercivalRichards78(double Ebar)
double powi(double, long int)
diatomics h2("h2", 4100.,&hmi.H2_total, Yan_H2_CS)
multi_arr< long, 3 > QuantumNumbers2Index
TransitionProxy trans(const long ipHi, const long ipLo)
STATIC double Ca20cs123(long int i, long int j)
double CS_l_mixing_VOS12QM(long ipISO, long nelem, long n, long l, long lp, long s, long gLo, double tauLo, double IP_Ryd_Hi, double IP_Ryd_Lo, double temp, long Collider)
static double global_deltaE
double qg32(double, double, double(*)(double))
STATIC double C6cs123(long int i, long int j)
#define DEBUG_ENTRY(funcname)
double powpq(double x, int p, int q)
STATIC double cross_section(double EgammaRyd, double EthRyd, long nelem, long n, long l, long s)
int fprintf(const Output &stream, const char *format,...)
double pow(double x, int i)
STATIC realnum HlikeCSInterp(long nelem, long Collider, long nHi, long lHi, long sHi, long nLo, long lLo, long sLo)
double hydro_vs_deexcit(long nHi, long gHi, double IP_Ryd_Hi, long nLo, long gLo, double IP_Ryd_Lo, double Aul)
double CS_l_mixing_PS64_expI(long nelem, double tau, double target_charge, long n, long l, double g, long lp, double deltaE_eV, long Collider)
STATIC double Therm_ave_coll_str_int_PR78(double EOverKT)
bool lgCaseB_HummerStorey