29 long nHi,
long lHi,
long sHi,
long jHi,
30 long nLo,
long lLo,
long sLo,
long jLo );
32 STATIC double CS_l_mixing_S62(
double deltaE_eV,
double IP_Ryd_ground,
long gLo,
double Aul,
long nelem,
long Collider,
double temp );
55 class StarkCollTransProb_VF01;
56 class StarkCollTransProb_VOS12QM;
70 double tauLo_1,
double IP_Ryd_Hi_1,
double IP_Ryd_Lo_1,
long Collider_1,
double temp_1) :
81 if( ! ( s > 0 &&
n > 0 ) )
83 fprintf(
ioQQQ,
"invalid parameter for my_Integrand_VF01_E\n" );
109 double reduced_b_maxa, reduced_b_maxb;
135 double quantum_defect1 = (double)n- (
double)
nelem/sqrt(
IP_Ryd_Lo);
136 double quantum_defect2 = (double)n- (
double)
nelem/sqrt(
IP_Ryd_Hi);
139 ASSERT( fabs(quantum_defect1) < 1.0 );
140 ASSERT( fabs(quantum_defect1) > 0.0 );
141 ASSERT( fabs(quantum_defect2) < 1.0 );
142 ASSERT( fabs(quantum_defect2) > 0.0 );
145 double omega_qd1 = fabs( 5.* quantum_defect1 * (1.-0.6*
POW2((
double)
l/(
double)n)) /
POW3( (
double)n ) / (
double)
l );
147 double omega_qd2 = fabs( 5.* quantum_defect2 * (1.-0.6*
POW2((
double)
lp/(
double)n)) /
POW3( (
double)n ) / (
double)
lp );
149 omega_qd = 0.5*( omega_qd1 + omega_qd2 );
169 double PS_crit = deltaE_eV*
tauLo/HBAReV;
171 reduced_b_maxb = 1.12*HBAReV*vred/deltaE_eV/
aveRadius;
182 meanb =
MIN2(meanb,reduced_b_maxa);
185 meanb = reduced_b_maxa;
186 double beta_brock= meanb*abs(deltaE_eV)/(HBAReV*4.*PI*vred);
187 if (beta_brock >= 0.4)
188 reduced_b_maxb = 1.12*HBAReV*vred/deltaE_eV/
aveRadius;
210 double col_str = collision_strength_VF01<P>(
ipISO, EOverKT *
temp / TE1RYD,
212 return exp( -1.*EOverKT ) * col_str;
226 double tauLo_1,
double IP_Ryd_Hi_1,
double IP_Ryd_Lo_1,
long Collider_1,
double temp_1) :
227 data(ipISO_1, nelem_1, n_1, l_1, lp_1, s, gLo_1,
228 tauLo_1, IP_Ryd_Hi_1, IP_Ryd_Lo_1, Collider_1, temp_1) {}
232 double EOverKT = -log(y);
234 double col_str = collision_strength_VF01<P>(
data.ipISO, EOverKT *
data.temp / TE1RYD,
242 long i, i1, j, nelem, ipHi, ipLo;
266 fprintf(
ioQQQ,
" HeCollidSetup could not read first line of he1_cs.dat.\n");
270 i1 = (long)
FFmtRead(chLine,&i,
sizeof(chLine),&lgEOL);
278 " HeCollidSetup: the version of he1_cs.dat is not the current version.\n" );
280 " HeCollidSetup: I expected to find the number %i and got %li instead.\n" ,
282 fprintf(
ioQQQ,
"Here is the line image:\n==%s==\n", chLine );
288 while(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) != NULL )
291 if( chLine[0] ==
'#')
296 char *chTemp = strtok(chLine,
" \t\n");
297 while( chTemp != NULL )
299 CSTemp.push_back( atof(chTemp) );
300 chTemp = strtok(NULL,
" \t\n");
306 fprintf(
ioQQQ,
" HeCollidSetup could not find line in CS temperatures in he1_cs.dat.\n");
316 for(
long ipHi=1; ipHi < numLevs; ++ipHi )
319 for(
long ipLo=0; ipLo<ipHi; ++ipLo )
323 for(
long ipHi=1; ipHi < numLevs; ++ipHi )
325 for(
long ipLo=0; ipLo<ipHi; ++ipLo )
327 for(
unsigned i=0; i<
CSTemp.size(); ++i )
329 HeCS[ipHi][ipLo][i] = -1.f;
337 while(
read_whole_line( chLine , (
int)
sizeof(chLine) , ioDATA ) != NULL )
341 if( (chLine[0] ==
' ') || (chLine[0]==
'\n') )
343 if( chLine[0] !=
'#')
347 ipLo = (long)
FFmtRead(chLine,&j,
sizeof(chLine),&lgEOL);
348 ipHi = (long)
FFmtRead(chLine,&j,
sizeof(chLine),&lgEOL);
356 for(
long i=0; i<3; ++i )
358 if( (chTemp =
strchr_s( chTemp,
'\t' )) == NULL )
366 for(
unsigned i=0; i<
CSTemp.size(); ++i )
369 if( (chTemp =
strchr_s( chTemp,
'\t' )) == NULL )
371 fprintf(
ioQQQ,
" HeCollidSetup could not scan cs, current indices: %li %li\n", ipHi, ipLo );
375 sscanf( chTemp ,
"%le" , &a );
376 HeCS[ipHi][ipLo][i] = (
realnum)a;
424 nHi, lHi, sHi, jHi, gHi, IP_Ryd_Hi,
425 nLo, lLo, sLo, jLo, gLo, IP_Ryd_Lo,
426 Aul, tauLo, EnerWN, EnerErg );
434 long nHi,
long lHi,
long sHi,
long jHi,
long gHi,
double IP_Ryd_Hi,
435 long nLo,
long lLo,
long sLo,
long jLo,
long gLo,
double IP_Ryd_Lo,
436 double Aul,
double tauLo,
double EnerWN,
double EnerErg )
442 const char *where =
" ";
451 double deltaE_eV = EnerErg/EN1EV;
454 if( nLo==2 && lLo==1 && sLo==3 )
456 factor1 *= (2.f*jLo+1.f) / 9.f;
460 if( nHi==2 && lHi==1 && sHi==3 )
462 factor1 *= (2.f*jHi+1.f) / 9.f;
470 if( (cs =
HeCSTableInterp( nelem, Collider, nHi, lHi, sHi, jHi, nLo, lLo, sLo, jLo )) >= 0.f )
473 if( nLo==2 && lLo==1 && sLo==3 && nHi==2 && lHi==1 && sHi==3 )
493 if( lHi==0 && sHi==3 )
494 cs = 0.25f/
POW2(nelem+1.f);
495 else if( lHi==0 && sHi==1 )
496 cs = 0.4f/
POW2(nelem+1.f);
497 else if( lHi==1 && sHi==3 && jHi==0 )
498 cs = 0.15f/
POW2(nelem+1.f);
499 else if( lHi==1 && sHi==3 && jHi==1 )
500 cs = 0.45f/
POW2(nelem+1.f);
501 else if( lHi==1 && sHi==3 && jHi==2 )
502 cs = 0.75f/
POW2(nelem+1.f);
503 else if( lHi==1 && sHi==1 )
504 cs = 1.3f/
POW2(nelem+1.f);
509 else if( nLo==2 && lLo==0 && sLo==3 )
511 if( lHi==0 && sHi==1 )
512 cs = 2.75f/
POW2(nelem+1.f);
513 else if( lHi==1 && sHi==3 && jHi==0 )
514 cs = 60.f/
POW2(nelem+1.f);
515 else if( lHi==1 && sHi==3 && jHi==1 )
516 cs = 180.f/
POW2(nelem+1.f);
517 else if( lHi==1 && sHi==3 && jHi==2 )
518 cs = 300.f/
POW2(nelem+1.f);
519 else if( lHi==1 && sHi==1 )
520 cs = 5.8f/
POW2(nelem+1.f);
525 else if( nLo==2 && lLo==0 && sLo==1 )
527 if( lHi==1 && sHi==3 && jHi==0 )
528 cs = 0.56f/
POW2(nelem+1.f);
529 else if( lHi==1 && sHi==3 && jHi==1 )
530 cs = 1.74f/
POW2(nelem+1.f);
531 else if( lHi==1 && sHi==3 && jHi==2 )
532 cs = 2.81f/
POW2(nelem+1.f);
533 else if( lHi==1 && sHi==1 )
534 cs = 190.f/
POW2(nelem+1.f);
539 else if( nLo==2 && lLo==1 && sLo==3 && jLo==0 )
541 if( lHi==1 && sHi==3 && jHi==1 )
542 cs = 8.1f/
POW2(nelem+1.f);
543 else if( lHi==1 && sHi==3 && jHi==2 )
544 cs = 8.2f/
POW2(nelem+1.f);
545 else if( lHi==1 && sHi==1 )
546 cs = 3.9f/
POW2(nelem+1.f);
551 else if( nLo==2 && lLo==1 && sLo==3 && jLo==1 )
553 if( lHi==1 && sHi==3 && jHi==2 )
554 cs = 30.f/
POW2(nelem+1.f);
555 else if( lHi==1 && sHi==1 )
556 cs = 11.7f/
POW2(nelem+1.f);
561 else if( nLo==2 && lLo==1 && sLo==3 && jLo==2 )
563 ASSERT( lHi==1 && sHi==1 );
574 else if( (nHi==nLo) && (sHi==sLo) )
699 long nLo1 = nLo, nHi1 = nHi;
739 fprintf(
ioQQQ,
"Check VF01 %ld %ld %ld %ld %ld %ld %g: %g (%g) VOS12 %g (%g) VOS12QM %g PS64 %g\n",
740 Collider,nLo1,lLo1,lHi1,sLo,nelem,
phycon.
te,
745 CS_l_mixing_PS64(nelem,tauLo,nelem+1.-ipISO1,nLo1,lLo1,gHi,lHi1,deltaE_eV,Collider));
746 double rate_t1, rate_t2, rate_t;
747 double oHi=1./(double)gHi;
748 double ogLo=1./(double)gLo;
751 double ratef =
powpq(ELECTRON_MASS/reduced_mass_collider_system,3,2) * COLL_CONST/
phycon.
sqrte;
753 rate_t1 = cs1*ratef*oHi;
754 rate_t2 = cs2*ratef*ogLo;
755 rate_t = rate_t1+rate_t2;
756 fprintf(
ioQQQ,
"Rates for H %ld %ld %ld %ld %ld %ld %ld %ld %g: %g %g \n",
757 nLo1,lLo1,lHi1,sLo,sHi,jLo,jHi,nelem,
phycon.
te,rate_t,
dense.
eden);
814 else if( nHi != nLo )
824 fixit(
"This should not be set here!" );
843 double x = log10(
MAX2(34.7,EnerWN));
871 if( EnerWN < 25119.f )
887 fixit(
"Use Percival and Richards here." );
912 enum {DEBUG_LOC=
false};
915 if( DEBUG_LOC && (cs > 0.f) )
917 fprintf(
ioQQQ,
"DEBUGGG HeCSInterp %li\t%li\t%li\t%li\t-\t%li\t%li\t%li\t%e\t%s\n",
930 long nHi,
long lHi,
long sHi,
long jHi,
931 long nLo,
long lLo,
long sLo,
long jLo )
943 fixit(
"HeCS allocation must be changed in order to remove this and do collapsed levels here." );
947 else if( lLo < 0 || lHi < 0 )
955 if( nLo==2 && lLo==1 && sLo==3 )
957 ASSERT( jLo>=0 && jLo<=2 );
960 if( nHi==2 && lHi==1 && sHi==3 )
962 ASSERT( jHi>=0 && jHi<=2 );
969 if( HeCS[ipHi][ipLo][0] < 0.f )
979 cs = HeCS[ipHi][ipLo][0];
983 cs = HeCS[ipHi][ipLo][
CSTemp.size()-1];
994 ASSERT( (flow >= 0.) && (flow <= 1.) );
996 cs = HeCS[ipHi][ipLo][ipArray] * (1.-flow) +
997 HeCS[ipHi][ipLo][ipArray+1] * flow;
1009 deltaE(deltaE), osc_strength(osc_strength), temp(temp), I_energy_eV(I_energy_eV)
1011 void operator() (
const double proj_energy_overKT[],
double res[],
long n)
const;
1016 STATIC double CS_l_mixing_S62(
double deltaE_eV,
double IP_Ryd_ground,
long gLo,
double Aul,
long nelem,
long Collider,
double temp )
1026 ASSERT( TRANS_PROB_CONST*
POW2(deltaE_eV/WAVNRYD/EVRYD) > 0. );
1028 double osc_strength = Aul / (TRANS_PROB_CONST*
POW2(deltaE_eV/WAVNRYD/EVRYD));
1029 double I_energy_eV = EVRYD * IP_Ryd_ground;
1045 double elow = 0., emid = 1.*energy_factor, ehigh = 10.*energy_factor;
1048 double coll_str = S62.
sum( elow, emid );
1049 coll_str += S62.
sum( emid, ehigh );
1051 coll_str /= energy_factor;
1055 coll_str =
ConvCrossSect2CollStr(coll_str*PI*BOHR_RADIUS_CM*BOHR_RADIUS_CM, (
double)gLo, 1.0, reduced_mass);
1064 if( zOverB2 > 100. )
1066 betaone = sqrt( 1./zOverB2 );
1068 else if( zOverB2 < 0.54 )
1071 double logz = log(zOverB2/PI);
1072 betaone = (1./3.)*(1.28-logz);
1073 if( betaone > 2.38 )
1076 betaone += -0.5*logz;
1082 long ip_zOverB2 = 0;
1083 static const double zetaOVERbeta2[101] = {
1084 1.030E+02,9.840E+01,9.402E+01,8.983E+01,8.583E+01,8.200E+01,7.835E+01,7.485E+01,
1085 7.151E+01,6.832E+01,6.527E+01,6.236E+01,5.957E+01,5.691E+01,5.436E+01,5.193E+01,
1086 4.961E+01,4.738E+01,4.526E+01,4.323E+01,4.129E+01,3.943E+01,3.766E+01,3.596E+01,
1087 3.434E+01,3.279E+01,3.131E+01,2.989E+01,2.854E+01,2.724E+01,2.601E+01,2.482E+01,
1088 2.369E+01,2.261E+01,2.158E+01,2.059E+01,1.964E+01,1.874E+01,1.787E+01,1.705E+01,
1089 1.626E+01,1.550E+01,1.478E+01,1.409E+01,1.343E+01,1.280E+01,1.219E+01,1.162E+01,
1090 1.107E+01,1.054E+01,1.004E+01,9.554E+00,9.094E+00,8.655E+00,8.234E+00,7.833E+00,
1091 7.449E+00,7.082E+00,6.732E+00,6.397E+00,6.078E+00,5.772E+00,5.481E+00,5.202E+00,
1092 4.937E+00,4.683E+00,4.441E+00,4.210E+00,3.989E+00,3.779E+00,3.578E+00,3.387E+00,
1093 3.204E+00,3.031E+00,2.865E+00,2.707E+00,2.557E+00,2.414E+00,2.277E+00,2.148E+00,
1094 2.024E+00,1.907E+00,1.795E+00,1.689E+00,1.589E+00,1.493E+00,1.402E+00,1.316E+00,
1095 1.235E+00,1.157E+00,1.084E+00,1.015E+00,9.491E-01,8.870E-01,8.283E-01,7.729E-01,
1096 7.206E-01,6.712E-01,6.247E-01,5.808E-01,5.396E-01};
1098 ASSERT( zOverB2 >= zetaOVERbeta2[100] );
1101 long ilo=0, ihi = 100;
1104 long imid = (ilo+ihi)/2.;
1105 if ( zetaOVERbeta2[imid] > zOverB2 )
1112 ASSERT( ( zOverB2 < zetaOVERbeta2[ilo] ) && ( zOverB2 >= zetaOVERbeta2[ilo+1] ) );
1116 ASSERT( (ip_zOverB2 >=0) && (ip_zOverB2 < 100) );
1118 const double fp = 1.023292992280754131;
1119 betaone =
exp10( (
double)ip_zOverB2/100. - 1.)*
1120 ( (zOverB2 - zetaOVERbeta2[ip_zOverB2]) * fp
1121 -zOverB2 + zetaOVERbeta2[ip_zOverB2+1] )/
1122 (zetaOVERbeta2[ip_zOverB2+1] - zetaOVERbeta2[ip_zOverB2]);
1136 for(
long i=0; i < n; ++i )
1137 x[i] = -proj_energy[i]*EVDEGK/
temp;
1140 for(
long i=0; i < n; ++i )
1146 double Dubya = proj_energy[i] + 0.5*
deltaE;
1164 double zeta_of_betaone = zOverB2 *
POW2(betaone);
1168 double k0val, k1val;
1170 double cs2 = 0.5*zeta_of_betaone + betaone * k0val * k1val;
1180 res[i] = val[i] * (proj_energy[i]+
deltaE)/EVRYD * cross_section;
1192 double target_charge,
1201 double RD,R12,Sij,Plowb,RC,RC1,EC,ED,
1202 reduced_mass, reduced_mass_2_emass,bracket,contr, rate;
1204 double eEm,eED,eEC,eEmt1Em;
1210 const double tau_zero = 2.41889e-17;
1211 long lmax =
MAX2(l,lp);
1212 double n2 = (double)n*(
double)n;
1213 double lmax2 = (double)lmax*(
double)lmax;
1215 reduced_mass_2_emass = reduced_mass / ELECTRON_MASS;
1222 double vred = sqrt(tempryd/reduced_mass_2_emass);
1224 double tau_ua = tau/tau_zero;
1230 Sij = 9.*n2*lmax*(n2-lmax2)/(2.*target_charge*target_charge);
1234 R12 = 2. *
pow2(ChargIncoming)/(3.*Plowb*vred*vred*(2.*l+1));
1240 RD = sqrt(tempryd/(8.*PI*dens_au));
1243 RC1 = 0.72*tau_ua*vred;
1249 double PS_crit = deltaE_eV*tau/HBAReV;
1253 / (PI2*ELEM_CHARGE_ESU);
1258 meanb =
MIN2(meanb,bmax);
1262 double v = sqrt(2.*BOLTZMANN*
phycon.
te/reduced_mass);
1263 double beta_brock= meanb*abs(deltaE_eV)/(HBAReV*4.*PI*v);
1269 RC1 = 1.12*HBAReV*vred/deltaE_eV/tau_zero;
1273 RC1 = 1.12*HBAReV*vred/deltaE_eV/tau_zero;
1290 double Emin = R12/(RC*RC);
1303 double Dnl = 2. *
pow2(ChargIncoming)*Sij/(3.*(2.*l+1.));
1308 EC = RD*RD/(RC1*RC1);
1310 eEm = exp(-1.*Emin);
1313 eEmt1Em = eEm*(1.+Emin);
1318 if ( fb1 == 1 && fb2 == 1)
1319 bracket = eEm +
e1(Emin);
1323 bracket = fb1*eEm+ fb2*
e1(Emin);
1327 bracket = fb1*eEm + 2.*
e1(Emin) -
e1(EC);
1329 bracket = fb1*eED +
e1(ED);
1338 contr = (1.-eEmt1Em)/Emin;
1343 contr = 2.*( 1. -eEmt1Em)/
pow2(Emin);
1348 contr = ( 2. -eEC*(2.+EC))/
pow2(Emin);
1349 contr -= eEm*(1.+1./ED);
1366 double units = 2.*
pow(BOHR_RADIUS_CM,3)*sqrt(PI)/vred/tau_zero;
1368 rate = units * Dnl* bracket;
1373 cs = rate / ( COLL_CONST *
powpq(reduced_mass_2_emass, -3, 2) ) *
phycon.
sqrte * g;
1385 double target_charge,
1396 TwoLogDebye, TwoLogRc1,
1398 bestfactor, factorpart,
1399 reduced_mass, reduced_mass_2_emass,
1413 reduced_mass_2_emass = reduced_mass / ELECTRON_MASS;
1426 TwoLogRc1 = 10.95 + log10(
phycon.
te * tau * tau / reduced_mass_2_emass );
1432 double PS_crit = deltaE_eV*tau/HBAReV;
1436 / (2*ELEM_CHARGE_ESU);
1437 double vred = sqrt(2.*BOLTZMANN*
phycon.
te/reduced_mass);
1443 meanb =
MIN2(meanb,bmax);
1448 double beta_brock= meanb*abs(deltaE_eV)/(HBAReV*4.*PI*vred);
1449 double deltaE_cm = deltaE_eV*EN1EV/ERG1CM;
1459 TwoLogRc1 = log10(
phycon.
te*ELECTRON_MASS/
pow2(deltaE_cm)/reduced_mass)-11.22;
1466 TwoLogRc1 = log10(
phycon.
te*ELECTRON_MASS/
pow2(deltaE_cm)/reduced_mass)-11.22;
1473 double Dnl =
POW2( ChargIncoming / target_charge) * 6. *
POW2( (
double)n) *
1474 (
POW2((
double)n) -
POW2((
double)l) - l - 1);
1491 long lmax =
MAX2(l,lp);
1495 double Dnlup =
POW2( ChargIncoming / target_charge) * 6. *
POW2( (
double)n) * lmax * (n*n-lmax*lmax) /
double( 2*l+1 );
1506 factorpart = (11.54 + log10(
phycon.
te / Dnl / reduced_mass_2_emass ) );
1508 if( (factor1 = factorpart + TwoLogDebye) <= 0.)
1511 if( (factor2 = factorpart + TwoLogRc1) <= 0.)
1515 bestfactor =
MIN2(factor1,factor2);
1517 ASSERT( bestfactor > 0. );
1520 if( bestfactor > 100. )
1526 rate = 9.93e-6 * sqrt( reduced_mass_2_emass ) * Dnlup /
phycon.
sqrte * bestfactor;
1531 cs = rate / ( COLL_CONST *
powpq(reduced_mass_2_emass, -3, 2) ) *
1564 integType func(ipISO,nelem,n,l,lp,s,gLo,tauLo,IP_Ryd_Hi,IP_Ryd_Lo,Collider,temp);
1578 coll_str = func(1.0)*exp(1.0);
1587 coll_str = VF01_E.
sum( 0.0, 1.0 );
1588 coll_str += VF01_E.
sum( 1.0, 10.0 );
1592 double xn=0., xl = 10.;
1595 while (xl < 100. && func(xl/2.) == 0.)
1603 VF01_ER(integrate::Midpoint<integType>(func,xn,xl));
1605 coll_str = VF01_ER.
sum();
1612 integLogType funcl(ipISO,nelem,n,l,lp,s,gLo,tauLo,IP_Ryd_Hi,IP_Ryd_Lo,Collider,temp);
1613 double x1n = 0.0, x1x = 1.0;
1615 double x1m = 0.5*(x1n+x1x);
1616 if (funcl(x1m) > 0.)
1620 }
while ((x1x-x1n) > 0.001);
1622 VF01_ESL(integrate::Midpoint<integLogType>(funcl,0.0,x1x));
1625 Integrator<integType, Gaussian32> VF01_E(func);
1626 double coll_strg = VF01_E.
sum( 0.0, 1.0 );
1627 coll_strg += VF01_E.
sum( 1.0, 10.0 );
1630 VF01_ERL(integrate::Midpoint<integLogType>(funcl,0.0,x1x));
1632 fprintf(ioQQQ,"Int %ld %ld->%ld ER %g(%g) %ld ESL %g(%g) %ld ERL %g(%g) %ld G %g
S %g\n",
1645 coll_str,VF01_ER.error(),VF01_ER.evals()
1670 return CS_l_mixing<StarkCollTransProb_VF01>(ipISO,nelem,n,l,lp,s,gLo,tauLo,
1671 IP_Ryd_Hi,IP_Ryd_Lo,temp,Collider);
1688 return CS_l_mixing<StarkCollTransProb_VOS12QM>(ipISO,nelem,n,l,lp,s,gLo,
1689 tauLo,IP_Ryd_Hi,IP_Ryd_Lo,temp,Collider);
1696 double m_alpha, m_alphamin, m_sinfac;
1698 Chi_VF01(
double alpha,
double alphamin) : m_alpha(alpha), m_alphamin(alphamin)
1708 double deltaPhi = -PI;
1709 m_sinfac =
pow2(sin(0.5*deltaPhi*sqrt(1+m_alpha*m_alpha)));
1711 double sinChiOver2sq()
const
1714 if( m_alpha <= m_alphamin)
1718 double denom = (1.+m_alpha*m_alpha), ratio = m_alpha/denom;
1719 return 4.*ratio*ratio*m_sinfac*(denom-m_alpha*m_alpha*m_sinfac);
1721 double cosChi()
const
1723 double alphasq =
pow2(m_alpha);
1724 return 1.-2.*alphasq*m_sinfac/(1.+alphasq);
1728 class StarkCollTransProb_VF01
1731 double cosU1, cosU2, sinU1sinU2;
1733 StarkCollTransProb_VF01(
long int n1,
long int l1,
long int lp1) : n(n1), l(l1), lp(lp1)
1736 cosU1 = 2.*
POW2((
double)l/(
double)n) - 1.;
1737 cosU2 = 2.*
POW2((
double)lp/(
double)n) - 1.;
1738 sinU1sinU2 = sqrt( ( 1. - cosU1*cosU1 )*( 1. - cosU2*cosU2 ) );
1740 double operator()(
double alpha,
double alphamin)
const;
1741 double bfun(
double alpha,
double alphamin)
const
1743 double sinChiOver2sq = Chi_VF01(alpha, alphamin).sinChiOver2sq();
1744 double cosChi = 1. - 2*sinChiOver2sq;
1745 return (cosU1*cosU2 + sinU1sinU2 - cosChi);
1749 double StarkCollTransProb_VF01::operator() (
double alpha,
double alphamin)
const
1751 DEBUG_ENTRY(
"StarkCollTransProb_VF01::operator()()" );
1753 ASSERT( alpha >= 1e-30 );
1755 double sinChiOver2sq = Chi_VF01(alpha, alphamin).sinChiOver2sq();
1762 if( l == 0 || lp == 0 )
1764 long lf =
max(l,lp);
1765 if( n*n*sinChiOver2sq <= lf*lf )
1777 probability = (lf+0.5) / sqrt( n*n*sinChiOver2sq * (n*n*sinChiOver2sq - lf*lf) );
1782 probability /= (2.*l+1);
1789 if( OneMinusCosChi == 0. )
1791 double hold = sin( deltaPhi / 2. );
1793 OneMinusCosChi = 8. * alpha * alpha *
POW2( hold );
1797 if( sinChiOver2sq == 0. )
1803 double cosChi = 1. - 2*sinChiOver2sq;
1805 double A = (cosU1*cosU2 - sinU1sinU2 - cosChi);
1806 double B = (cosU1*cosU2 + sinU1sinU2 - cosChi);
1815 ASSERT( sinChiOver2sq > 0. );
1817 probability = 2.*lp/(PI* n*n* sinChiOver2sq );
1827 probability *=
ellpk( -A/(B-A) ) * sqrt( 2*sinChiOver2sq / (B - A) );
1831 probability *=
ellpk( A/B ) * sqrt( 2*sinChiOver2sq / B );
1841 class my_Integrand_VF01_alpha :
public D_fp
1846 my_Integrand_VF01_alpha(
long int n,
long int l,
long int lp,
double alphamin) :
1847 s( n, l, lp), alphamin(alphamin) {}
1851 ASSERT( alpha >= 1.e-30 );
1853 return s( alpha, alphamin )/(alpha*alpha*alpha);
1855 double bfun (
double alpha)
const
1857 return s.bfun(alpha,alphamin);
1862 class my_Integrand_VF01_beta :
public D_fp
1869 my_Integrand_VF01_beta(
long int n,
long int l,
long int lp,
double alphamin) :
1870 s( n, l, lp), alphamin(alphamin) {}
1874 double alpha = exp(beta);
1875 ASSERT( alpha >= 1.e-30 );
1877 return s( alpha, alphamin )/(alpha*alpha);
1879 double bfun (
double alpha)
const
1881 return s.bfun(alpha,alphamin);
1885 class StarkCollTransProb_VOS12QM
1888 double cosU1, cosU2, sinU1sinU2;
1889 vector<double> common;
1891 StarkCollTransProb_VOS12QM(
long int n1,
long int l1,
long int lp1) : n(n1), l(l1), lp(lp1), common(n)
1894 cosU1 = 2.*
POW2((
double)l/(
double)n) - 1.;
1895 cosU2 = 2.*
POW2((
double)lp/(
double)n) - 1.;
1897 sinU1sinU2 = sqrt( ( 1. - cosU1*cosU1 )*( 1. - cosU2*cosU2 ) );
1898 long Lmax =
MIN2(n-1,lp+l), Lmin = abs(lp-l);
1899 double ffac = 1./sqrt(
double(n));
1901 for (
long L=1; L < Lmin; ++L)
1903 ffac *= L/sqrt(
double(nsq-L*L));
1907 fprintf(
ioQQQ,
" PROBLEM: Catastrophic underflow in VOS12 QM transition probability\n"
1908 " Try reducing resolved levels\n");
1912 const int sjtyp = 1;
1915 double l1min,l1max,lmatch;
1917 rec6j(
get_ptr(common)+Lmin,lp,l,0.5*(n-1),0.5*(n-1),0.5*(n-1),
1918 &l1min,&l1max,&lmatch,n-Lmin,&ier);
1919 ASSERT(Lmin ==
int(l1min) && ier >= 0);
1921 for (
long L=Lmin; L <= Lmax; ++L)
1924 ffac *= L/sqrt(
double(nsq-L*L));
1934 sixj1 =
sjs(2*lp,2*l,2*L,n-1,n-1,n-1);
1935 else if (sjtyp == 2)
1936 sixj1 =
SixJFull(2*lp,2*l,2*L,n-1,n-1,n-1);
1939 common[L] = sixj1*ffac*sqrt(2.*
double(L)+1.);
1942 double operator()(
double alpha,
double alphamin)
const;
1943 double bfun (
double,
double )
const
1949 double StarkCollTransProb_VOS12QM::operator() (
double alpha,
double alphamin)
const
1951 DEBUG_ENTRY(
"StarkCollTransProb_VOS12QM::operator()()" );
1952 ASSERT( alpha >= 1e-30 );
1954 Chi_VF01 chi(alpha, alphamin);
1955 double sinChiOver2sq = chi.sinChiOver2sq();
1963 double cosChiVOS12QM = chi.cosChi();
1964 ASSERT( cosChiVOS12QM <= 1);
1966 long Lmax =
MIN2(n-1,lp+l);
1968 for (
long L=n-1; L > Lmax; --L)
1972 double frac = 4*sinChiOver2sq;
1974 for (
long L=Lmax; L >= abs(lp-l); --L)
1976 double gegen = u.val();
1982 double gegen1 =
gegenbauer(n-L-1,L+1,cosChiVOS12QM);
1984 1000*DBL_EPSILON+1e-10*fabs(gegen1)))
1985 fprintf(
ioQQQ,
"DEBUG %ld %ld %g: %g %g %g\n",n,L,cosChiVOS12QM,
1986 gegen1,gegen,gegen/gegen1-1.);
1989 double fac = common[L]*gegen;
1992 pqm *=
powi(frac,abs(lp-l))*(2*lp+1);
1998 void compare_VOS12()
2004 long n=30, l = 4, lp = 3, npt = 1000;
2006 StarkCollTransProb_VOS12QM qm( n, l, lp);
2007 StarkCollTransProb_VF01 cl( n, l, lp);
2009 for (
long i=0; i<npt; ++i)
2011 double ban = 900*(i+0.5)/double(npt);
2012 double alpha = 1.5/(ban*v);
2014 cl(alpha,alphamin),qm(alpha,alphamin));
2020 long n=28, l = 5, lp = 13, npt = 1000;
2022 StarkCollTransProb_VOS12QM qm( n, l, lp);
2023 StarkCollTransProb_VF01 cl( n, l, lp);
2024 for (
long i=0; i<npt; ++i)
2026 double alpha = (i+0.5)/double(npt);
2028 cl(alpha,alphamin),qm(alpha,alphamin));
2034 long n=8, l = 5, lp = 6, npt = 1000;
2036 vector<StarkCollTransProb_VOS12QM> qm;
2037 for (
long i=0; i<4; ++i)
2040 qm.push_back(StarkCollTransProb_VOS12QM(
2041 scale*n, scale*l, scale*lp));
2043 StarkCollTransProb_VF01 cl( n, l, lp);
2044 for (
long i=0; i<npt; ++i)
2046 double alpha = (i+0.5)/double(npt);
2049 for (vector<StarkCollTransProb_VOS12QM>::iterator it=qm.begin();
2050 it != qm.end(); ++it)
2061 long n=30, l = 29, npt = 10000;
2063 vector<StarkCollTransProb_VOS12QM> qm;
2064 for (
long lp=0; lp<n; ++lp)
2065 qm.push_back(StarkCollTransProb_VOS12QM( n, l, lp));
2067 for (
long i=0; i<npt; ++i)
2069 double ban = 400*(i+0.5)/double(npt);
2070 double alpha = 1.5/(ban*v);
2072 for (
long lp=0; lp<n; ++lp)
2074 qm[lp](alpha,alphamin));
2085 long nelem,
double gLo,
long Ztarget,
long Collider,
double sqrte)
2088 long lmin = (lp < l) ? lp : l, dl = abs(l-lp);
2089 double nlfac = double(n*n*(n*n*(l+lp)-lmin*lmin*(l+lp+2*dl)))/
2092 double massratio =
reduced_amu(nelem,Collider)/ELECTRON_MASS;
2093 double rate = 1.294e-5*sqrt(massratio)*Z*Z/(Ztarget*Ztarget*sqrte) * nlfac;
2094 double cs = rate / ( COLL_CONST *
powpq(massratio, -3, 2) ) * sqrte * gLo;
2100 double alphamin_int,
double alphamax_int)
2102 if (alphamin_int >= alphamax_int)
2104 double CSIntegral = 0.;
2106 double step = (alphamax_int - alphamin_int)/5.;
2107 double alpha1 = alphamin_int;
2108 CSIntegral += VF01_alpha.
sum( alpha1, alpha1+step );
2109 CSIntegral += VF01_alpha.
sum( alpha1+step, alpha1+4.*step );
2115 double alphamin_int,
double alphamax_int,
double eps)
2117 if (alphamin_int >= alphamax_int)
2122 double alphalo = alphamin_int;
2125 double alphahi = alphamax_int;
2126 while (alphahi-alphalo > 0.5*eps*(alphahi+alphalo))
2128 double alphamid = 0.5*(alphahi+alphalo);
2129 if (func.bfun(alphamid) <= 0.)
2138 VF01_alphaR(integrate::Midpoint<my_Integrand_VF01_beta<P> >(func,log(alphalo),log(alphamax_int)));
2140 return VF01_alphaR.
sum();
2145 double alphamin_int, double alphamax_int, double eps)
2147 if (alphamin_int >= alphamax_int)
2151 double alphalo = alphamin_int;
2154 double alphahi = alphamax_int;
2155 while (alphahi-alphalo > 0.5*eps*(alphahi+alphalo))
2157 double alphamid = 0.5*(alphahi+alphalo);
2158 if (func.bfun(alphamid) <= 0.)
2167 VF01_alphaR(integrate::Midpoint<my_Integrand_VF01_alpha<P> >(func,alphalo,alphamax_int));
2169 return VF01_alphaR.
sum();
2174 const my_Integrand_VF01_E<P>& vf)
2179 double reduced_b_max1;
2182 double reduced_vel = sqrt( 2.*E_Proj_Ryd*EN1RYD/vf.reduced_mass )/vf.RMSv;
2185 ASSERT( reduced_vel > 1.e-10 );
2186 ASSERT( reduced_vel < 1.e10 );
2194 double alphamax = 15000./
pow2(vf.n);
2209 double reduced_b_min = 1.5 * vf.ColliderCharge /reduced_vel/alphamax;
2210 ASSERT( reduced_b_min > 1.e-10 );
2211 ASSERT( reduced_b_min < 1.e10 );
2215 double reduced_debye = sqrt( BOLTZMANN*vf.temp/vf.ColliderCharge/
dense.
eden/PI )
2216 / (2.*ELEM_CHARGE_ESU)/vf.aveRadius;
2218 reduced_b_max1 = vf.reduced_b_max*sqrt(E_Proj_Ryd*EN1RYD/BOLTZMANN/vf.temp);
2220 reduced_b_max1 = vf.reduced_b_max;
2224 if (reduced_b_max1 <= reduced_b_min)
2227 reduced_b_max1 =
MAX2( reduced_b_max1, reduced_b_min );
2228 ASSERT( reduced_b_max1 > 0. );
2230 double alphamin = 1.5*vf.ColliderCharge/(reduced_vel * reduced_b_max1);
2236 double alphamin_int =
MAX2( alphamin, 1.e-30 );
2237 double alphamax_int =
MAX2( alphamax, 1.e-20 );
2239 double CSIntegral = 0.;
2243 my_Integrand_VF01_alpha<P> func(vf.n, vf.l, vf.lp, alphamin);
2248 my_Integrand_VF01_beta<P> funcb(vf.n, vf.l, vf.lp, alphamin);
2255 double epsabs=0., epsrel=1e-5, abserr, qqq;
2256 const long limit=25, lenw=4*limit;
2257 long neval, ier,last, iwork[limit];
2259 double lalphamin_int = log(alphamin_int),
2260 lalphamax_int = log(alphamax_int);
2261 dqags_(funcb,&lalphamin_int,&lalphamax_int,&epsabs,&epsrel,&qqq,
2262 &abserr,&neval,&ier,&limit,&lenw,&last,iwork,work);
2269 my_Integrand_VF01_alpha<P> func(vf.n, vf.l, vf.lp, alphamin);
2284 double epsabs=0., epsrel=1e-5, abserr;
2285 const long limit=25, lenw=4*limit;
2286 long neval, ier,last, iwork[limit];
2288 double lalphamin_int = log(alphamin_int),
2289 lalphamax_int = log(alphamax_int);
2290 dqags_(funcb,&lalphamin_int,&lalphamax_int,&epsabs,&epsrel,&qqq,
2291 &abserr,&neval,&ier,&limit,&lenw,&last,iwork,work);
2292 fprintf(
ioQQQ,
"Check VF QAGS1 err=%g neval=%ld ier=%ld\n",abserr,neval,ier);
2294 if (CSIntegral > 0. || qqq > 0.)
2296 fprintf(
ioQQQ,
"Check VF[%ld %ld->%ld %g %g]: %s %g var %g err=%g\n",
2297 vf.n,vf.l,vf.lp,E_Proj_Ryd,alphamin,
2298 ccc,qqq,CSIntegral,(qqq-CSIntegral)/
SDIV(CSIntegral));
2305 double ConstantFactors = 4.5*PI*
POW2(vf.ColliderCharge*vf.aveRadius/reduced_vel);
double operator()(double EOverKT) const
virtual double operator()(double) const =0
FILE * open_data(const char *fname, const char *mode, access_scheme scheme)
realnum EnergyErg() const
bool lgCS_PSClassic[NISO]
NORETURN void TotalInsanity(void)
my_Integrand_S62(double deltaE, double osc_strength, double temp, double I_energy_eV)
STATIC double CS_l_mixing_S62(double deltaE_eV, double IP_Ryd_ground, long gLo, double Aul, long nelem, long Collider, double temp)
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)
double SixJFull(long j1, long j2, long j3, long j4, long j5, long j6)
STATIC double CSIntegral_Romberg(long ipISO, const my_Integrand_VF01_beta< P > &func, double alphamin_int, double alphamax_int, double eps)
bool fp_equal_tol(sys_float x, sys_float y, sys_float tol)
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 lgColl_l_mixing[NISO]
double sjs(long j1, long j2, long j3, long l1, long l2, long l3)
multi_arr< realnum, 3 > HeCS
bool lgCS_Vrinceanu[NISO]
realnum HeCSInterp(long nelem, long ipHi, long ipLo, long Collider)
void bessel_k0_k1(double x, double *k0val, double *k1val)
t_iso_sp iso_sp[NISO][LIMELM]
void vexp(const double x[], double y[], long nlo, long nhi)
double reduced_amu(long nelem, long Collider)
double xIonDense[LIMELM][LIMELM+1]
double operator()(double y) const
ColliderList colliders(dense)
double CS_l_mixing_VOS12(long n, long l, long lp, long nelem, double gLo, long Ztarget, long Collider, double sqrte)
double CS_VS80(long nHi, long gHi, double IP_Ryd_Hi, long nLo, long gLo, double IP_Ryd_Lo, double Aul, long nelem, long Collider, double temp)
my_Integrand_VF01_E_log(long ipISO_1, long nelem_1, long n_1, long l_1, long lp_1, long s, long gLo_1, double tauLo_1, double IP_Ryd_Hi_1, double IP_Ryd_Lo_1, long Collider_1, double temp_1)
realnum & EnergyWN() const
double sum(double min, double max) const
STATIC double collision_strength_VF01(long ipISO, double velOrEner, const my_Integrand_VF01_E< P > &vf)
EmissionList::reference Emis() const
void dqags_(const D_fp &f, const double *a, const double *b, const double *epsabs, const double *epsrel, double *result, double *abserr, long *neval, long *ier, const long *limit, const long *lenw, long *last, long *iwork, double *work)
my_Integrand_VF01_E< P > data
double powi(double, long int)
const char * strchr_s(const char *s, int c)
STATIC double S62BesselInvert(double zOverB2)
double sum(double min, double max) const
multi_arr< long, 3 > QuantumNumbers2Index
TransitionProxy trans(const long ipHi, const long ipLo)
realnum AtomicWeight[LIMELM]
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)
void reserve(size_type i1)
vector< t_collider > list
void operator()(const double proj_energy_overKT[], double res[], long n) const
#define DEBUG_ENTRY(funcname)
double powpq(double x, int p, int q)
static const double ColliderCharge[4]
STATIC double cross_section(double EgammaRyd, double EthRyd, long nelem, long n, long l, long s)
double ConvCrossSect2CollStr(double CrsSectCM2, double gLo, double E_ProjectileRyd, double reduced_mass_grams)
void rec6j(double *sixcof, double l2, double l3, double l4, double l5, double l6, double *l1min, double *l1max, double *lmatch, long ndim, long *ier)
int fprintf(const Output &stream, const char *format,...)
my_Integrand_VF01_E(long ipISO_1, long nelem_1, long n_1, long l_1, long lp_1, long s, long gLo_1, double tauLo_1, double IP_Ryd_Hi_1, double IP_Ryd_Lo_1, long Collider_1, double temp_1)
sys_float SDIV(sys_float x)
double pow(double x, int i)
char * read_whole_line(char *chLine, int nChar, FILE *ioIN)
STATIC double CSIntegral_Romberg_alpha(long ipISO, const my_Integrand_VF01_alpha< P > &func, double alphamin_int, double alphamax_int, double eps)
STATIC realnum HeCSTableInterp(long nelem, long Collider, long nHi, long lHi, long sHi, long jHi, long nLo, long lLo, long sLo, long jLo)
double gegenbauer(long n, double al, double x)
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 CSIntegral_QG32(const my_Integrand_VF01_alpha< P > &func, double alphamin_int, double alphamax_int)
double CS_l_mixing(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)
realnum GetHelikeCollisionStrength(long nelem, long Collider, long nHi, long lHi, long sHi, long jHi, long gHi, double IP_Ryd_Hi, long nLo, long lLo, long sLo, long jLo, long gLo, double IP_Ryd_Lo, double Aul, double tauLo, double EnerWN, double EnerErg)
double FFmtRead(const char *chCard, long int *ipnt, long int last, bool *lgEOL)