00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "cddefines.h"
00011 #include "phycon.h"
00012 #include "physconst.h"
00013 #include "iso.h"
00014 #include "hydro_vs_rates.h"
00015 #include "lines_service.h"
00016
00017 STATIC double hydro_vs_coll_str( double energy );
00018 STATIC double Therm_ave_coll_str_int_VS80( double EOverKT );
00019
00020 static long global_ipISO, global_nelem, global_ipHi, global_ipLo, global_Collider;
00021 static double global_temp, global_Aul;
00022
00023 static double ColliderMass[4] = {ELECTRON_MASS/PROTON_MASS, 1.0, 4.0, 4.0};
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 double CS_VS80( long int ipISO, long int nelem, long int ipHi, long int ipLo, double Aul, double temp, long int Collider )
00036 {
00037 double coll_str;
00038
00039 global_ipISO = ipISO;
00040 global_nelem = nelem;
00041 global_ipHi = ipHi;
00042 global_ipLo = ipLo;
00043 global_temp = temp;
00044 global_Collider = Collider;
00045 global_Aul = Aul;
00046
00047
00048
00049
00050
00051
00052 if( iso.lgCollStrenThermAver )
00053 {
00054
00055 coll_str = qg32( 0.0, 1.0, Therm_ave_coll_str_int_VS80);
00056 coll_str += qg32( 1.0, 10.0, Therm_ave_coll_str_int_VS80);
00057 }
00058 else
00059 {
00060
00061
00062 coll_str = hydro_vs_coll_str( EVRYD*global_temp/TE1RYD );
00063 }
00064
00065 ASSERT( coll_str >= 0. );
00066 return coll_str;
00067 }
00068
00069
00070 STATIC double Therm_ave_coll_str_int_VS80( double EOverKT )
00071 {
00072 double integrand;
00073
00074 integrand = exp( -1.*EOverKT ) * hydro_vs_coll_str( EOverKT * EVRYD*global_temp/TE1RYD );
00075
00076 return integrand;
00077 }
00078
00079
00080
00081 STATIC double hydro_vs_coll_str( double energy )
00082 {
00083 double Apn, bp, Bpn, delta;
00084 double Epi, Epn;
00085 double gamma, p, n;
00086 double ryd, s;
00087 double cross_section, coll_str, gLo, gHi, abs_osc_str, Aul;
00088 long ipISO, nelem, ipHi, ipLo, Collider;
00089
00090 DEBUG_ENTRY( "hydro_vs_coll_str()" );
00091
00092 ipISO = global_ipISO;
00093 nelem = global_nelem;
00094 ipHi = global_ipHi;
00095 ipLo = global_ipLo;
00096 Collider = global_Collider;
00097 Aul = global_Aul;
00098
00099 gLo = StatesElem[ipISO][nelem][ipLo].g;
00100 gHi = StatesElem[ipISO][nelem][ipHi].g;
00101
00102
00103
00104
00105
00106
00107
00108
00109 n = (double)StatesElem[ipISO][nelem][ipHi].n;
00110 p = (double)StatesElem[ipISO][nelem][ipLo].n;
00111
00112 ryd = EVRYD;
00113 s = fabs(n-p);
00114
00115 Epn = EVRYD*(iso.xIsoLevNIonRyd[ipISO][nelem][ipLo] - iso.xIsoLevNIonRyd[ipISO][nelem][ipHi]);
00116 Epi = EVRYD*iso.xIsoLevNIonRyd[ipISO][nelem][ipLo];
00117
00118
00119 abs_osc_str = GetGF( Aul, Epn*RYD_INF/EVRYD, gHi)/gLo;
00120 Apn = 2.*ryd/Epn*abs_osc_str;
00121
00122 bp = 1.4*log(p)/p - .7/p - .51/p/p + 1.16/p/p/p - 0.55/p/p/p/p;
00123
00124 Bpn = 4.*ryd*ryd/n/n/n*(1./Epn/Epn + 4./3.*Epi/POW3(Epn) + bp*Epi*Epi/powi(Epn,4));
00125
00126 delta = exp(-Bpn/Apn) - 0.4*Epn/ryd;
00127
00128 gamma = ryd*(8. + 23.*POW2(s/p))/
00129 ( 8. + 1.1*n*s + 0.8/s/s + 0.4*(pow(n,1.5))/(pow(s,0.5))*fabs(s-1.0) );
00130
00131
00132 energy *= ColliderMass[ipELECTRON]/ColliderMass[Collider];
00133
00134
00135 if( energy/2./ryd+delta <= 0 )
00136 {
00137 cross_section = 0.;
00138 }
00139 else
00140 {
00141 cross_section = 2.*ryd/(energy + gamma)*(Apn*log(energy/2./ryd+delta) + Bpn);
00142 cross_section = MAX2( cross_section, 0. );
00143 }
00144
00145
00146 coll_str = cross_section * gLo * (energy/EVRYD);
00147
00148 if( nelem==ipCARBON )
00149 ASSERT( coll_str >= 0. );
00150
00151 return( coll_str );
00152 }
00153
00154
00155
00156 double hydro_vs_ioniz( long int ipISO, long int nelem, long int level )
00157 {
00158 double coef,
00159 denom,
00160 epi,
00161 t_eV;
00162
00163 DEBUG_ENTRY( "hydro_vs_ioniz()" );
00164
00165 ASSERT( nelem <= 1 );
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 t_eV = phycon.te/EVDEGK;
00176
00177
00178 epi = (iso.xIsoLevNIonRyd[ipISO][nelem][level] * EVRYD) / t_eV;
00179
00180
00181 denom = pow(epi,2.33) + 4.38*pow(epi,1.72) + 1.32*epi;
00182
00183
00184 coef = 9.56e-6 * pow(t_eV,-1.5) * StatesElem[ipISO][nelem][level].ConBoltz / denom;
00185
00186 ASSERT( coef >= 0. );
00187 return( coef );
00188 }
00189
00190
00191 double Hion_coll_ioniz_ratecoef(
00192
00193 long int ipISO ,
00194
00195
00196 long int nelem,
00197
00198
00199 long int level)
00200 {
00201 long int n;
00202 double H,
00203 HydColIon_v,
00204 Rnp,
00205 charge,
00206 chim,
00207 eone,
00208 etwo,
00209 ethree,
00210 g,
00211 rate,
00212 rate2,
00213
00214 t1,
00215 t2,
00216 t3,
00217 t4,
00218 tev,
00219 xn,
00220 y;
00221 static const double arrH[4] = {1.48,3.64,5.93,8.32};
00222 static const double arrRnp[8] = {2.20,1.90,1.73,1.65,1.60,1.56,1.54,1.52};
00223 static const double arrg[10] = {0.8675,0.932,0.952,0.960,0.965,0.969,0.972,0.975,0.978,0.981};
00224
00225 static double small = 0.;
00226
00227 DEBUG_ENTRY( "Hion_coll_ioniz_ratecoef()" );
00228
00229
00230
00231
00232
00234 charge = nelem - ipISO;
00235
00236 ASSERT( charge > 0);
00237
00238
00239 n = StatesElem[ipISO][nelem][level].n;
00240 ASSERT( n>1 );
00241
00242 if( n > 4 )
00243 {
00244 H = 2.15*n;
00245 }
00246 else
00247 {
00248 H = arrH[n-1];
00249 }
00250
00251 if( n > 8 )
00252 {
00253 Rnp = 1.52;
00254 }
00255 else
00256 {
00257 Rnp = arrRnp[n-1];
00258 }
00259
00260 if( n > 10 )
00261 {
00262 g = arrg[9];
00263 }
00264 else
00265 {
00266 g = arrg[n-1];
00267 }
00268
00269 tev = EVRYD/TE1RYD*phycon.te;
00270
00271 xn = (double)n;
00272
00273
00274 chim = EVRYD * iso.xIsoLevNIonRyd[ipISO][nelem][level];
00275 y = chim/tev;
00276
00277 eone = ee1(y);
00278 etwo = StatesElem[ipISO][nelem][level].ConBoltz - y*eone;
00279 ethree = (StatesElem[ipISO][nelem][level].ConBoltz - y*etwo)/2.;
00280
00281 t1 = 1/xn*eone;
00282 t2 = 1./3./xn*(StatesElem[ipISO][nelem][level].ConBoltz - y*ethree);
00283 t3 = 3.*H/xn/(3. - Rnp)*(y*etwo - 2.*y*eone + StatesElem[ipISO][nelem][level].ConBoltz);
00284 t4 = 3.36*y*(eone - etwo);
00285 rate = 7.69415e-9*(double)phycon.sqrte*9.28278e-3*powi(xn/(charge+1),4)*g*y;
00286 rate *= t1 - t2 + t3 + t4;
00288 rate = MAX2(rate,small);
00289
00290 rate2 = 2.1e-8*phycon.sqrte/chim/chim*dsexp(2.302585*5040.*
00291 chim/(double)phycon.te);
00292
00293 rate2 = MAX2(rate2,small);
00294
00295
00296
00297
00298 if( rate==0. || rate2==0. )
00299 HydColIon_v = MAX2(rate,rate2);
00300 else
00301 HydColIon_v = MIN2(rate,rate2);
00302
00303 ASSERT( HydColIon_v >= 0. );
00304 return( HydColIon_v );
00305 }
00306
00307
00308
00309 double hydro_vs_deexcit( long ipISO, long nelem, long ipHi, long ipLo, double Aul )
00310 {
00311 double Anp, bn, Bnp, delta_np;
00312 double Eni, Enp;
00313 double Gamma_np, p, n, g_p, g_n;
00314 double ryd, s, kT_eV, rate, col_str, abs_osc_str;
00315
00316 DEBUG_ENTRY( "hydro_vs_coll_str()" );
00317
00318 kT_eV = EVRYD * phycon.te / TE1RYD;
00319
00320
00321
00322
00323
00324
00325
00326
00327 n = (double)StatesElem[ipISO][nelem][ipLo].n;
00328 p = (double)StatesElem[ipISO][nelem][ipHi].n;
00329
00330 ASSERT( n!=p );
00331
00332 g_n = StatesElem[ipISO][nelem][ipLo].g;
00333 g_p = StatesElem[ipISO][nelem][ipHi].g;
00334
00335 ryd = EVRYD;
00336 s = fabs(n-p);
00337
00338 Enp = EVRYD*(iso.xIsoLevNIonRyd[ipISO][nelem][ipLo] - iso.xIsoLevNIonRyd[ipISO][nelem][ipHi]);
00339 Eni = EVRYD*iso.xIsoLevNIonRyd[ipISO][nelem][ipHi];
00340
00341 ASSERT( Enp > 0. );
00342
00343
00344 abs_osc_str = GetGF( Aul, Enp*RYD_INF/EVRYD, g_p)/g_n;
00345 Anp = 2.*ryd/Enp*abs_osc_str;
00346
00347 bn = 1.4*log(n)/n - .7/n - .51/n/n + 1.16/n/n/n - 0.55/n/n/n/n;
00348
00349 Bnp = 4.*ryd*ryd/p/p/p*(1./Enp/Enp + 4./3.*Eni/POW3(Enp) + bn*Eni*Eni/powi(Enp,4));
00350
00351 delta_np = exp(-Bnp/Anp) + 0.1*Enp/ryd;
00352
00353 Gamma_np = ryd*log(1. + n*n*n*kT_eV/ryd) * (3. + 11.*s*s/n/n) /
00354 ( 6. + 1.6*p*s + 0.3/s/s + 0.8*(pow(p,1.5))/(pow(s,0.5))*fabs(s-0.6) );
00355
00356 if( 0.3*kT_eV/ryd+delta_np <= 0 )
00357 {
00358 rate = 0.;
00359 }
00360 else
00361 {
00362 rate = 1.6E-7 * pow(kT_eV, 0.5) * g_n / g_p / ( kT_eV + Gamma_np ) *
00363 ( Anp * log(0.3*kT_eV/ryd + delta_np) + Bnp );
00364 }
00365
00366 col_str = rate / COLL_CONST * phycon.sqrte * StatesElem[ipISO][nelem][ipHi].g;
00367
00368 return( col_str );
00369 }