00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "cddefines.h"
00010 #include "phycon.h"
00011 #include "physconst.h"
00012 #include "abund.h"
00013 #include "dense.h"
00014 #include "iso.h"
00015 #include "thermal.h"
00016 #include "mole.h"
00017 #include "elementnames.h"
00018 #include "heavy.h"
00019 #include "trace.h"
00020 #include "conv.h"
00021 #include "atmdat.h"
00022 #include "taulines.h"
00023
00024
00025 STATIC double HCTIon(long int ion,
00026 long int nelem);
00027
00028
00029 STATIC double HCTRecom(long int ion,
00030 long int nelem);
00031
00032
00033 STATIC void MakeHCTData(void);
00034
00035
00036
00037 static double CTIonData[LIMELM][4][8];
00038 static double CTRecombData[LIMELM][4][7];
00039
00040
00041 static bool lgCTDataDefined = false;
00042
00043
00044 void ChargTranEval(
00045
00046 double *O_HIonRate )
00047 {
00048 long int ion,
00049 nelem;
00050 double a, b, c, a_op, b_op, c_op, d_op, e_op, f_op, a_o,
00051 b_o, c_o, d_o, e_o, f_o, g_o;
00052
00053 static double TeUsed = -1.;
00054
00055 DEBUG_ENTRY( "ChargTranEval()" );
00056
00057
00058 if( !conv.nTotalIoniz || !fp_equal(phycon.te,TeUsed) )
00059 {
00060
00061
00062 for( nelem=ipHELIUM; nelem < LIMELM; nelem++ )
00063 {
00064 for( ion=0; ion <= nelem; ion++ )
00065 {
00066
00067
00068
00069
00070
00071
00072
00073
00074 atmdat.HCharExcIonOf[nelem][ion] = HCTIon(ion,nelem);
00075
00076
00077
00078
00079
00080
00081 atmdat.HCharExcRecTo[nelem][ion] = HCTRecom(ion,nelem);
00082 }
00083
00084
00085 for( ion=0; ion < LIMELM; ion++ )
00086 {
00087 atmdat.HeCharExcIonOf[nelem][ion] = 0.;
00088 atmdat.HeCharExcRecTo[nelem][ion] = 0.;
00089 }
00090 }
00091
00092
00093
00094
00095 if( phycon.te > 6000. )
00096 atmdat.HCharExcRecTo[ipHELIUM][0] += 7.47e-15*pow(phycon.te/1e4,2.06)*
00097 (1.+9.93*sexp(3.89e-4*phycon.te) );
00098
00099
00100
00101
00102 if(!co.lgUMISTrates)
00103 {
00104 atmdat.HCharExcRecTo[ipHELIUM][0] = 4.85e-15*pow(phycon.te/300, 0.18);
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 if(phycon.te <= 10. )
00118 {
00119 atmdat.HCharExcRecTo[ipOXYGEN][0] = 3.744e-10;
00120 atmdat.HCharExcIonOf[ipOXYGEN][0] = 4.749e-20;
00121 }
00122
00123
00124 if( phycon.te > 10.)
00125 {
00126 a_op = 2.3344302e-10;
00127 b_op = 2.3651505e-10;
00128 c_op = -1.3146803e-10;
00129 d_op = 2.9979994e-11;
00130 e_op = -2.8577012e-12;
00131 f_op = 1.1963502e-13;
00132
00133 double lnte = phycon.alnte;
00134
00135
00136 atmdat.HCharExcRecTo[ipOXYGEN][0] =
00137 ((((f_op*lnte + e_op)*lnte + d_op)*lnte + c_op)*lnte + b_op)*lnte + a_op;
00138 }
00139
00140
00141
00142
00143 if((phycon.te > 10.) && (phycon.te <= 190.))
00144 {
00145 a = -21.134531;
00146 b = -242.06831;
00147 c = 84.761441;
00148
00149
00150 atmdat.HCharExcIonOf[ipOXYGEN][0] = exp((a + b/SDIV(phycon.te) + c/SDIV(phycon.tesqrd)));
00151 }
00152
00153 else if((phycon.te > 190.) && (phycon.te <= 200.))
00154 {
00155
00156
00157
00158
00159
00160
00161 atmdat.HCharExcIonOf[ipOXYGEN][0] = 2.18733e-12*(phycon.te-190) + 1.85823e-10;
00162 }
00163
00164 else if(phycon.te > 200.)
00165 {
00166
00167 a_o = -7.6767404e-14;
00168 b_o = -3.7282001e-13;
00169 c_o = -1.488594e-12;
00170 d_o = -3.6606214e-12;
00171 e_o = 2.0699463e-12;
00172 f_o = -2.6139493e-13;
00173 g_o = 1.1580844e-14;
00174
00175 double lnte = phycon.alnte;
00176
00177
00178 atmdat.HCharExcIonOf[ipOXYGEN][0] =
00179 (((((g_o*lnte + f_o)*lnte + e_o)*lnte + d_o)*lnte + c_o)*lnte + b_o)*lnte + a_o;
00180 }
00181
00182
00183
00184 if(!co.lgUMISTrates)
00185 {
00186 atmdat.HCharExcIonOf[ipOXYGEN][0] = HMRATE(7.31e-10,0.23,225.9);
00187 atmdat.HCharExcRecTo[ipOXYGEN][0] = HMRATE(5.66e-10,0.36,-8.60);
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 atmdat.HCharExcIonOf[ipIRON][0] = 5.4e-9;
00207
00208
00209
00210
00211
00212
00213 atmdat.HCharExcIonOf[ipALUMINIUM][0] = 3e-9;
00214
00215
00216
00217 atmdat.HCharExcIonOf[ipPHOSPHORUS][0] = 1e-9;
00218
00219
00220
00221 atmdat.HCharExcIonOf[ipCHLORINE][0] = 1e-9;
00222
00223
00224
00225 atmdat.HCharExcIonOf[ipTITANIUM][0] = 3e-9;
00226
00227
00228
00229 atmdat.HCharExcIonOf[ipMANGANESE][0] = 3e-9;
00230
00231
00232
00233 atmdat.HCharExcIonOf[ipNICKEL][0] = 3e-9;
00234
00235
00236
00237
00238
00239
00240
00241 atmdat.HCharExcIonOf[ipSODIUM][0] = 7e-12;
00242
00243
00244
00245
00246
00247
00248
00249 atmdat.HCharExcIonOf[ipSODIUM][0] += 0.7e-12;
00250
00251
00252
00253
00254
00255
00256 atmdat.HCharExcIonOf[ipPOTASSIUM][0] = 1.25e-12;
00257
00258
00259
00260
00261
00262
00263 atmdat.HCharExcIonOf[ipSULPHUR][0] = 1.e-14;
00264
00265 if( phycon.te < 1e5 )
00266 {
00267
00268
00269
00270
00271
00272 atmdat.HCharExcIonOf[ipMAGNESIUM][0] = 9.76e-12*pow((phycon.te/1e4),3.14)*(1. + 55.54*sexp(1.12*phycon.te/1e4));
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284 atmdat.HCharExcIonOf[ipSILICON][0] = 0.92e-12*pow((phycon.te/1e4),1.15)*(1. + 0.80*sexp(0.24*phycon.te/1e4));
00285
00286
00288
00289
00290
00291
00292
00293
00294
00295 atmdat.HCharExcIonOf[ipLITHIUM][0] = 2.84e-12*pow((phycon.te/1e4),1.99)*(1. + 375.54*sexp(54.07*phycon.te/1e4));
00298 }
00299 else
00300 {
00302 atmdat.HCharExcIonOf[ipMAGNESIUM][0] = 0.;
00303 atmdat.HCharExcIonOf[ipSILICON][0] = 0.;
00304 atmdat.HCharExcIonOf[ipLITHIUM][0] = 0.;
00305 }
00306
00307 {
00308
00309
00310
00311
00312
00313
00314 double tefac = phycon.te * phycon.alnte;
00315
00316
00317
00318 double ct_from_n0grhp_to_npgrh0 = (1.64e-16*phycon.te - 8.76e-17*tefac + 2.41e-20*phycon.tesqrd + 9.83e-13*phycon.alnte )*
00319 sexp( 10985./phycon.te ) * atmdat.lgCTOn;
00320
00321
00323
00324
00325
00326 double ct_from_npgrh0_to_n0grhp = (1.56e-15*phycon.te - 1.79e-16*tefac + 1.15e-20*phycon.tesqrd + 1.08e-13*phycon.alnte) * atmdat.lgCTOn;
00327
00328
00329
00330 atmdat.HCharExcRecTo_N0_2D = (6.83e-16*phycon.te - 7.40e-17*tefac + 3.73e-21*phycon.tesqrd + 1.75e-15*phycon.alnte)*
00331 sexp( 16680./phycon.te ) * atmdat.lgCTOn;
00332
00333
00334
00335 atmdat.HCharExcIonOf[ipNITROGEN][0] = ct_from_n0grhp_to_npgrh0;
00336 atmdat.HCharExcRecTo[ipNITROGEN][0] = ct_from_npgrh0_to_n0grhp + atmdat.HCharExcRecTo_N0_2D;
00337 }
00338
00339
00340
00341
00342
00343 if( phycon.te <= 1500. )
00344 {
00345 atmdat.HCharExcRecTo[ipOXYGEN][1] = 0.5337e-9*pow( (phycon.te/100.) ,-0.076);
00346 }
00347 else
00348 {
00349 atmdat.HCharExcRecTo[ipOXYGEN][1] = 0.4344e-9 +
00350 0.6340e-9*pow( log10(phycon.te/1500.) ,2.06 );
00351 }
00352
00353
00354 if( phycon.te <= 1500. )
00355 {
00356 atmdat.HCharExcRecTo[ipNITROGEN][1] = 0.8692e-9*pow( (phycon.te/1500.) ,0.17);
00357 }
00358 else if( phycon.te <= 20000. )
00359 {
00360 atmdat.HCharExcRecTo[ipNITROGEN][1] = 0.9703e-9*pow( (phycon.te/10000.) ,0.058);
00361 }
00362 else
00363 {
00364 atmdat.HCharExcRecTo[ipNITROGEN][1] = 1.0101e-9 +
00365 1.4589e-9*pow( log10(phycon.te/20000.) ,2.06 );
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382 atmdat.HeCharExcRecTo[ipCARBON][2] = 4.6e-19*phycon.tesqrd;
00383
00384
00385
00386 atmdat.HeCharExcRecTo[ipCARBON][3] = 1e-14;
00387
00388
00389
00390
00391
00392
00393
00394 atmdat.HeCharExcIonOf[ipCARBON][0] = 6.3e-15*pow((phycon.te/300),0.75);
00395
00396
00397
00398 atmdat.HeCharExcIonOf[ipCARBON][1] =
00399 5e-20*phycon.tesqrd*sexp(0.07e-4*phycon.te)*sexp(6.29/phycon.te_eV);
00400
00401
00402
00403
00404
00405
00406
00407
00408 atmdat.HeCharExcRecTo[ipNITROGEN][1] = 0.8e-10;
00409
00410
00411
00412 atmdat.HeCharExcRecTo[ipNITROGEN][2] = 1.5e-10;
00413
00414
00415
00416
00417
00418 atmdat.HeCharExcRecTo[ipNITROGEN][3] = 2e-9;
00419
00420
00421
00422
00423 atmdat.HeCharExcIonOf[ipNITROGEN][1] =
00424 3.7e-20*phycon.tesqrd*sexp(0.063e-4*phycon.te)*sexp(1.44/phycon.te_eV);
00425
00426
00427
00428
00429
00430 atmdat.HeCharExcRecTo[ipOXYGEN][1] = 3.2e-14*phycon.te/phycon.te05;
00431
00432
00433 atmdat.HeCharExcRecTo[ipOXYGEN][2] = 1e-9;
00434
00435
00436 atmdat.HeCharExcRecTo[ipOXYGEN][3] = 6e-10;
00437
00438
00439
00440
00441 atmdat.HeCharExcIonOf[ipOXYGEN][0] =
00442 4.991E-15 * pow( phycon.te / 1e4, 0.3794 )* sexp( phycon.te/1.121E6 ) +
00443 2.780E-15 * pow( phycon.te / 1e4, -0.2163 )* exp( -1. * MIN2(1e7, phycon.te)/(-8.158E5) );
00444
00445
00446
00447
00448
00449 atmdat.HeCharExcRecTo[ipNEON][1] = 1e-14;
00450
00451
00452 atmdat.HeCharExcRecTo[ipNEON][2] = 1e-16*phycon.sqrte;
00453
00454
00455 atmdat.HeCharExcRecTo[ipNEON][3] = 1.7e-11*phycon.sqrte;
00456
00457
00458
00459
00460
00461 atmdat.HeCharExcRecTo[ipMAGNESIUM][2] = 7.5e-10;
00462
00463
00464 atmdat.HeCharExcRecTo[ipMAGNESIUM][3] = 1.4e-10*phycon.te30;
00465
00466
00467
00468
00469
00470
00471
00472
00473 atmdat.HeCharExcRecTo[ipSILICON][2] += phycon.sqrte*phycon.te10*phycon.te10*
00474 1.3*1.5e-12;
00475
00476
00477
00478 atmdat.HeCharExcRecTo[ipSILICON][3] = 2.54e-11*phycon.sqrte/phycon.te03/
00479 phycon.te01/phycon.te01;
00480
00481
00482
00483
00484 atmdat.HeCharExcIonOf[ipSILICON][0] = 3.3e-9;
00485
00486
00487
00488 atmdat.HeCharExcIonOf[ipSILICON][1] =
00489 1.5e-11*phycon.te20*phycon.te05*sexp(6.91/phycon.te_eV);
00490
00491
00492
00493 atmdat.HeCharExcIonOf[ipSILICON][2] =
00494 1.15e-11*phycon.sqrte*sexp(8.88/phycon.te_eV);
00495
00496
00497
00498
00499
00500 atmdat.HeCharExcRecTo[ipSULPHUR][2] = phycon.sqrte*1.1e-11;
00501
00502
00503
00504
00505 atmdat.HeCharExcRecTo[ipSULPHUR][3] = 4.8e-14*phycon.te30;
00506
00507
00508
00509
00510 atmdat.HeCharExcIonOf[ipSULPHUR][1] =
00511 4.4e-16*phycon.te*phycon.te20*sexp(0.036e-4*phycon.te)*sexp(9.2/phycon.te_eV);
00512
00513
00514
00515 atmdat.HeCharExcIonOf[ipSULPHUR][2] =
00516 5.5e-18*phycon.te*phycon.sqrte*phycon.te10*sexp(0.046e-4*phycon.te)*sexp(10.5/phycon.te_eV);
00517
00518
00519
00520
00521 atmdat.HeCharExcRecTo[ipARGON][1] = 1.3e-10;
00522
00523
00524 atmdat.HeCharExcRecTo[ipARGON][2] = 1.e-14;
00525
00526
00527 atmdat.HeCharExcRecTo[ipARGON][3] = 1.6e-8/phycon.te30;
00528
00529
00530
00531
00532 atmdat.HeCharExcIonOf[ipARGON][1] = 1.1e-10;
00533
00534 TeUsed = phycon.te;
00535
00536 if(!co.lgUMISTrates)
00537 {
00538
00539
00540
00541
00542 atmdat.HCharExcIonOf[ipHELIUM][0] = 0;
00543 atmdat.HCharExcIonOf[ipCARBON][0] = 0;
00544 atmdat.HCharExcRecTo[ipCARBON][0] = 0;
00545
00546 atmdat.HeCharExcRecTo[ipCARBON][0] = 0;
00547 atmdat.HeCharExcIonOf[ipOXYGEN][0] = 0;
00548 atmdat.HeCharExcRecTo[ipOXYGEN][0] = 0;
00549 }
00550
00551
00552
00553 if( !atmdat.lgCTOn )
00554 {
00555 for( nelem=0; nelem< LIMELM; ++nelem )
00556 {
00557 for( ion=0; ion<LIMELM; ++ion )
00558 {
00559 atmdat.HCharExcIonOf[nelem][ion] = 0.;
00560 atmdat.HCharExcRecTo[nelem][ion] = 0.;
00561 atmdat.HeCharExcIonOf[nelem][ion] = 0.;
00562 atmdat.HeCharExcRecTo[nelem][ion] = 0.;
00563 }
00564 }
00565 }
00566 }
00567
00568
00569 *O_HIonRate = atmdat.HCharExcRecTo[ipOXYGEN][0]*dense.xIonDense[ipOXYGEN][1];
00570 return;
00571 }
00572
00573
00574
00575 double ChargTranSumHeat(void)
00576 {
00577 long int ion,
00578 nelem;
00579 double SumCTHeat_v;
00580
00581 DEBUG_ENTRY( "ChargTranSumHeat()" );
00582
00583
00584
00585
00586
00587
00588 ASSERT( lgCTDataDefined );
00589
00590 SumCTHeat_v = 0.;
00591
00592 for( nelem=ipHELIUM; nelem < LIMELM; nelem++ )
00593 {
00594
00595
00596
00597 int limit = MIN2(4, nelem);
00598
00599 for( ion=0; ion < limit; ion++ )
00600 {
00601
00602
00603
00604
00605 SumCTHeat_v +=
00606
00607
00608 atmdat.HCharExcIonOf[nelem][ion]*CTIonData[nelem][ion][7]*
00609 (double)dense.xIonDense[ipHYDROGEN][1]*(double)dense.xIonDense[nelem][ion] +
00610
00611
00612 atmdat.HCharExcRecTo[nelem][ion]*CTRecombData[nelem][ion][6]*
00613 StatesElemNEW[ipHYDROGEN][ipHYDROGEN-ipH_LIKE][ipH1s].Pop*
00614 (double)dense.xIonDense[nelem][ion+1];
00615 }
00616
00617
00618
00619 for( ion=4; ion < nelem; ion++ )
00620 {
00621 SumCTHeat_v +=
00622 atmdat.HCharExcRecTo[nelem][ion]* 2.86*(double)ion *
00623 (double)dense.xIonDense[ipHYDROGEN][0]*(double)dense.xIonDense[nelem][ion+1];
00624 }
00625 }
00626
00627 #if 0
00628
00629 for( nelem=ipLITHIUM; nelem < LIMELM; nelem++ )
00630 {
00631
00632
00633
00634 int limit = MIN2(4, nelem);
00635
00636 for( ion=0; ion < limit; ion++ )
00637 {
00638 fixit();
00639 double barrier_rec_eV = 0.;
00640 double barrier_ion_eV = 0.;
00641
00642
00643
00644
00645 SumCTHeat_v +=
00646
00647
00648 atmdat.HeCharExcIonOf[nelem][ion]*barrier_rec_eV*
00649 (double)dense.xIonDense[ipHELIUM][1]*(double)dense.xIonDense[nelem][ion] +
00650
00651
00652 atmdat.HeCharExcRecTo[nelem][ion]*barrier_ion_eV*
00653 StatesElem[ipHE_LIKE][ipHELIUM][ipH1s].Pop*dense.xIonDense[ipHELIUM][1]*
00654 (double)dense.xIonDense[nelem][ion+1];
00655 }
00656
00657
00658
00659 for( ion=4; ion < nelem; ion++ )
00660 {
00661 SumCTHeat_v +=
00662 atmdat.HeCharExcRecTo[nelem][ion]* 2.86*(double)ion *
00663 (double)dense.xIonDense[ipHELIUM][0]*(double)dense.xIonDense[nelem][ion+1];
00664 }
00665 }
00666 #endif
00667
00668
00669
00670 SumCTHeat_v *= EN1EV * atmdat.HCharHeatOn;
00671
00672 if( thermal.htot > 1e-35 )
00673 {
00674
00675 atmdat.HCharHeatMax = MAX2(atmdat.HCharHeatMax,
00676 SumCTHeat_v/thermal.htot );
00677
00678 atmdat.HCharCoolMax = MAX2(atmdat.HCharCoolMax,
00679 -SumCTHeat_v/thermal.htot);
00680 }
00681
00682
00683 {
00684 enum {DEBUG_LOC=false};
00685 if( DEBUG_LOC)
00686 {
00687 # define FRAC 0.1
00688 for( nelem=ipHELIUM; nelem < LIMELM; nelem++ )
00689 {
00690
00691
00692
00693 int limit = MIN2(4, nelem);
00694
00695 for( ion=0; ion < limit; ion++ )
00696 {
00697 if(
00698
00699 (atmdat.HCharExcIonOf[nelem][ion]*CTIonData[nelem][ion][7]*
00700 (double)dense.xIonDense[ipHYDROGEN][1]*(double)dense.xIonDense[nelem][ion] +
00701
00702
00703 atmdat.HCharExcRecTo[nelem][ion]*CTRecombData[nelem][ion][6]*
00704 StatesElemNEW[ipHYDROGEN][ipHYDROGEN-ipH_LIKE][ipH1s].Pop*
00705 (double)dense.xIonDense[nelem][ion+1])/SumCTHeat_v> FRAC )
00706
00707 fprintf(ioQQQ,"DEBUG ct %li %li %.3f\n", nelem, ion,
00708 (atmdat.HCharExcIonOf[nelem][ion]*CTIonData[nelem][ion][7]*
00709 (double)dense.xIonDense[ipHYDROGEN][1]*(double)dense.xIonDense[nelem][ion] +
00710
00711
00712 atmdat.HCharExcRecTo[nelem][ion]*CTRecombData[nelem][ion][6]*
00713 StatesElemNEW[ipHYDROGEN][ipHYDROGEN-ipH_LIKE][ipH1s].Pop*
00714 (double)dense.xIonDense[nelem][ion+1]) );
00715 }
00716
00717 for( ion=4; ion < nelem; ion++ )
00718 {
00719 if(
00720 (atmdat.HCharExcRecTo[nelem][ion]* 2.86*(double)ion *
00721 (double)dense.xIonDense[ipHYDROGEN][0]*(double)dense.xIonDense[nelem][ion+1])/SumCTHeat_v> FRAC )
00722 fprintf(ioQQQ,"DEBUG ct %li %li %.3f\n", nelem, ion,
00723 (atmdat.HCharExcRecTo[nelem][ion]* 2.86*(double)ion *
00724 (double)dense.xIonDense[ipHYDROGEN][0]*(double)dense.xIonDense[nelem][ion+1]) );
00725 }
00726 }
00727 # undef FRAC
00728 fprintf(ioQQQ,"DEBUT ct tot %.e3\n", SumCTHeat_v / thermal.htot );
00729 }
00730 }
00731 return( SumCTHeat_v );
00732 }
00733
00734
00735
00736 STATIC double HCTIon(
00737
00738 long int ion,
00739
00740
00741 long int nelem)
00742 {
00743 double HCTIon_v,
00744 tused;
00745
00746 DEBUG_ENTRY( "HCTIon()" );
00747
00748
00749
00750 if( !lgCTDataDefined )
00751 {
00752 if( trace.lgTrace )
00753 {
00754 fprintf( ioQQQ," HCTIon doing 1-time init of charge transfer data\n");
00755 }
00756 lgCTDataDefined = true;
00757 MakeHCTData();
00758 }
00759
00760
00761
00762 ASSERT( CTIonData[2][0][0] > 0. );
00763
00764
00765 if( ion >= 3 )
00766 {
00767 HCTIon_v = 0.;
00768 return( HCTIon_v );
00769 }
00770
00771
00772
00773 ASSERT( ion >= 0);
00774 ASSERT( ion <= nelem );
00775
00776
00777 ASSERT( nelem > 0 );
00778 ASSERT( nelem < LIMELM );
00779
00780
00781 if( CTIonData[nelem][ion][0] <= 0. )
00782 {
00783 HCTIon_v = 0.;
00784
00785 }
00786
00787 else
00788 {
00789
00790 tused = MAX2((double)phycon.te,CTIonData[nelem][ion][4]);
00791 tused = MIN2(tused,CTIonData[nelem][ion][5]);
00792 tused *= 1e-4;
00793
00794
00795
00796
00797 HCTIon_v = CTIonData[nelem][ion][0]*1e-9*(pow(tused,CTIonData[nelem][ion][1]))*
00798 (1. + CTIonData[nelem][ion][2]*exp(CTIonData[nelem][ion][3]*tused))*
00799 exp(-CTIonData[nelem][ion][6]*1.e4/phycon.te);
00800 }
00801 return( HCTIon_v );
00802 }
00803
00804
00805
00806 STATIC double HCTRecom(
00807
00808 long int ion,
00809
00810
00811 long int nelem)
00812 {
00813 double HCTRecom_v,
00814 tused;
00815
00816 DEBUG_ENTRY( "HCTRecom()" );
00817
00818
00819
00820
00821
00822 if( !lgCTDataDefined )
00823 {
00824 if( trace.lgTrace )
00825 {
00826 fprintf( ioQQQ," HCTIon doing 1-time init of charge transfer data\n");
00827 }
00828 lgCTDataDefined = true;
00829 MakeHCTData();
00830 }
00831
00832
00833
00834 ASSERT( CTRecombData[1][0][0] > 0. );
00835
00836
00837
00838 if( ion > 3 )
00839 {
00840
00841
00842 HCTRecom_v = atmdat.HCTAlex*((double)ion+1.);
00843 return( HCTRecom_v );
00844 }
00845
00846
00847 ASSERT( ion >= 0 && ion <= nelem );
00848
00849
00850 ASSERT( nelem > 0 && nelem < LIMELM );
00851
00852 tused = MAX2((double)phycon.te,CTRecombData[nelem][ion][4]);
00853 tused = MIN2(tused,CTRecombData[nelem][ion][5]);
00854 tused *= 1e-4;
00855
00856 if( tused == 0. )
00857 {
00858 HCTRecom_v = 0.;
00859 return( HCTRecom_v );
00860 }
00861
00862
00863 HCTRecom_v = CTRecombData[nelem][ion][0]*1e-9*(pow(tused,CTRecombData[nelem][ion][1]))*
00864 (1. + CTRecombData[nelem][ion][2]*sexp(-CTRecombData[nelem][ion][3]*tused));
00865
00866
00867
00868 return( HCTRecom_v );
00869 }
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898 STATIC void MakeHCTData(void)
00899 {
00900 long int i,
00901 j,
00902 nelem,
00903 _r;
00904
00905 DEBUG_ENTRY( "MakeHCTData()" );
00906
00907
00908
00909
00910 for( nelem=0; nelem<LIMELM; ++nelem )
00911 {
00912 for( i=0; i<4; ++i )
00913 {
00914 for( j=0; j<7; ++j )
00915 {
00916 CTIonData[nelem][i][j] = 0.;
00917 CTRecombData[nelem][i][j] = 0.;
00918 }
00919 CTIonData[nelem][i][7] = 0.;
00920 }
00921 }
00922
00923
00924
00925
00926
00927
00928 { static double _itmp0[] = {2.84e-3 , 1.99 , 375.54 , -54.07 , 1e2 , 1e4 , 0.,
00929 -10.};
00930
00931 for( i=1, _r = 0; i <= 8; i++ )
00932 {
00933 CTIonData[2][0][i-1] = _itmp0[_r++];
00934 }
00935 }
00936
00937
00938 { static double _itmp1[] = {1.07e-6 , 3.15 , 176.43 , -4.29 , 1e3 , 1e5 , 0. ,2.34};
00939 for( i=1, _r = 0; i <= 8; i++ )
00940 {
00941 CTIonData[5][0][i-1] = _itmp1[_r++];
00942 }
00943 }
00944 { static double _itmp2[] = {4.55e-3,-0.29,-0.92,-8.38,1e2,5e4,
00945 1.086,-0.94};
00946 for( i=1, _r = 0; i <= 8; i++ )
00947 {
00948 CTIonData[6][0][i-1] = _itmp2[_r++];
00949 }
00950 }
00951
00952 { static double _itmp3[] = {7.40e-2,0.47,24.37,-0.74,1e1,1e4,
00953 0.023,-0.02};
00954 for( i=1, _r = 0; i <= 8; i++ )
00955 {
00956 CTIonData[7][0][i-1] = _itmp3[_r++];
00957 }
00958 }
00959 { static double _itmp4[] = {3.34e-6,9.31,2632.31,-3.04,1e3,
00960 2e4,0.0,-1.74};
00961 for( i=1, _r = 0; i <= 8; i++ )
00962 {
00963 CTIonData[10][0][i-1] = _itmp4[_r++];
00964 }
00965 }
00966 { static double _itmp5[] = {9.76e-3,3.14,55.54,-1.12,5e3,3e4,
00967 0.0,1.52};
00968 for( i=1, _r = 0; i <= 8; i++ )
00969 {
00970 CTIonData[11][0][i-1] = _itmp5[_r++];
00971 }
00972 }
00973 { static double _itmp6[] = {7.60e-5,0.00,-1.97,-4.32,1e4,3e5,
00974 1.670,-1.44};
00975 for( i=1, _r = 0; i <= 8; i++ )
00976 {
00977 CTIonData[11][1][i-1] = _itmp6[_r++];
00978 }
00979 }
00980 { static double _itmp7[] = {0.92,1.15,0.80,-0.24,1e3,2e5,0.0,
00981 0.12};
00982 for( i=1, _r = 0; i <= 8; i++ )
00983 {
00984 CTIonData[13][0][i-1] = _itmp7[_r++];
00985 }
00986 }
00987
00988 { static double _itmp8[] = {2.26 , 7.36e-2 , -0.43 , -0.11 , 2e3 , 1e5 , 3.031
00989 ,-2.72};
00990 for( i=1, _r = 0; i <= 8; i++ )
00991 {
00992 CTIonData[13][1][i-1] = _itmp8[_r++];
00993 }
00994 }
00995 { static double _itmp9[] = {1.00e-5,0.00,0.00,0.00,1e3,1e4,
00996 0.0,-3.24};
00997 for( i=1, _r = 0; i <= 8; i++ )
00998 {
00999 CTIonData[15][0][i-1] = _itmp9[_r++];
01000 }
01001 }
01002 { static double _itmp10[] = {4.39,0.61,-0.89,-3.56,1e3,3e4,
01003 3.349,-2.89};
01004 for( i=1, _r = 0; i <= 8; i++ )
01005 {
01006 CTIonData[23][1][i-1] = _itmp10[_r++];
01007 }
01008 }
01009 { static double _itmp11[] = {2.83e-1,6.80e-3,6.44e-2,-9.70,
01010 1e3,3e4,2.368,-2.04};
01011 for( i=1, _r = 0; i <= 8; i++ )
01012 {
01013 CTIonData[24][1][i-1] = _itmp11[_r++];
01014 }
01015 }
01016 { static double _itmp12[] = {2.10,7.72e-2,-0.41,-7.31,1e4,1e5,
01017 3.005,-2.56};
01018 for( i=1, _r = 0; i <= 8; i++ )
01019 {
01020 CTIonData[25][1][i-1] = _itmp12[_r++];
01021 }
01022 }
01023 { static double _itmp13[] = {1.20e-2,3.49,24.41,-1.26,1e3,3e4,
01024 4.044,-3.49};
01025 for( i=1, _r = 0; i <= 8; i++ )
01026 {
01027 CTIonData[26][1][i-1] = _itmp13[_r++];
01028 }
01029 }
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040 { static double _itmp14[] = {1.87e-6,2.06,9.93,-3.89,6e3,1e5,
01041 10.99};
01042 for( i=1, _r = 0; i <= 7; i++ )
01043 {
01044 CTRecombData[1][0][i-1] = _itmp14[_r++];
01045 }
01046 }
01047 { static double _itmp15[] = {1.00e-5,0.,0.,0.,1e3,1e7,-40.81};
01048 for( i=1, _r = 0; i <= 7; i++ )
01049 {
01050 CTRecombData[1][1][i-1] = _itmp15[_r++];
01051 }
01052 }
01053 for( i=1; i <= 7; i++ )
01054 {
01055 CTRecombData[2][0][i-1] = 0.f;
01056 }
01057 { static double _itmp16[] = {1.26,0.96,3.02,-0.65,1e3,3e4,3.02};
01058 for( i=1, _r = 0; i <= 7; i++ )
01059 {
01060 CTRecombData[2][1][i-1] = _itmp16[_r++];
01061 }
01062 }
01063 { static double _itmp17[] = {1.00e-5,0.,0.,0.,2e3,5e4,-108.83};
01064 for( i=1, _r = 0; i <= 7; i++ )
01065 {
01066 CTRecombData[2][2][i-1] = _itmp17[_r++];
01067 }
01068 }
01069 for( i=1; i <= 7; i++ )
01070 {
01071 CTRecombData[3][0][i-1] = 0.f;
01072 }
01073 { static double _itmp18[] = {1.00e-5,0.,0.,0.,2e3,5e4,-4.61};
01074 for( i=1, _r = 0; i <= 7; i++ )
01075 {
01076 CTRecombData[3][1][i-1] = _itmp18[_r++];
01077 }
01078 }
01079 { static double _itmp19[] = {1.00e-5,0.,0.,0.,2e3,5e4,-140.26};
01080 for( i=1, _r = 0; i <= 7; i++ )
01081 {
01082 CTRecombData[3][2][i-1] = _itmp19[_r++];
01083 }
01084 }
01085 { static double _itmp20[] = {5.17,0.82,-0.69,-1.12,2e3,5e4,
01086 10.59};
01087 for( i=1, _r = 0; i <= 7; i++ )
01088 {
01089 CTRecombData[3][3][i-1] = _itmp20[_r++];
01090 }
01091 }
01092 for( i=1; i <= 7; i++ )
01093 {
01094 CTRecombData[4][0][i-1] = 0.f;
01095 }
01096 { static double _itmp21[] = {2.00e-2,0.,0.,0.,1e3,1e9,2.46};
01097 for( i=1, _r = 0; i <= 7; i++ )
01098 {
01099 CTRecombData[4][1][i-1] = _itmp21[_r++];
01100 }
01101 }
01102 { static double _itmp22[] = {1.00e-5,0.,0.,0.,2e3,5e4,-24.33};
01103 for( i=1, _r = 0; i <= 7; i++ )
01104 {
01105 CTRecombData[4][2][i-1] = _itmp22[_r++];
01106 }
01107 }
01108
01109 { static double _itmp23[] = {2.74 , 0.93 , -0.61 , -1.13 , 2e3 , 5e4 ,
01110 11.};
01111 for( i=1, _r = 0; i <= 7; i++ )
01112 {
01113 CTRecombData[4][3][i-1] = _itmp23[_r++];
01114 }
01115 }
01116
01117 { static double _itmp24[] = {4.88e-7 , 3.25 , -1.12 , -0.21 , 5.5e3 , 1e5 ,
01118 -2.34};
01119 for( i=1, _r = 0; i <= 7; i++ )
01120 {
01121 CTRecombData[5][0][i-1] = _itmp24[_r++];
01122 }
01123 }
01124 { static double _itmp25[] = {1.67e-4,2.79,304.72,-4.07,5e3,
01125 5e4,4.01};
01126 for( i=1, _r = 0; i <= 7; i++ )
01127 {
01128 CTRecombData[5][1][i-1] = _itmp25[_r++];
01129 }
01130 }
01131 { static double _itmp26[] = {3.25,0.21,0.19,-3.29,1e3,1e5,5.73};
01132 for( i=1, _r = 0; i <= 7; i++ )
01133 {
01134 CTRecombData[5][2][i-1] = _itmp26[_r++];
01135 }
01136 }
01137 { static double _itmp27[] = {332.46,-0.11,-9.95e-1,-1.58e-3,
01138 1e1,1e5,11.30};
01139 for( i=1, _r = 0; i <= 7; i++ )
01140 {
01141 CTRecombData[5][3][i-1] = _itmp27[_r++];
01142 }
01143 }
01144 { static double _itmp28[] = {1.01e-3,-0.29,-0.92,-8.38,1e2,
01145 5e4,0.94};
01146 for( i=1, _r = 0; i <= 7; i++ )
01147 {
01148 CTRecombData[6][0][i-1] = _itmp28[_r++];
01149 }
01150 }
01151 { static double _itmp29[] = {3.05e-1,0.60,2.65,-0.93,1e3,1e5,
01152 4.56};
01153 for( i=1, _r = 0; i <= 7; i++ )
01154 {
01155 CTRecombData[6][1][i-1] = _itmp29[_r++];
01156 }
01157 }
01158 { static double _itmp30[] = {4.54,0.57,-0.65,-0.89,1e1,1e5,
01159 6.40};
01160 for( i=1, _r = 0; i <= 7; i++ )
01161 {
01162 CTRecombData[6][2][i-1] = _itmp30[_r++];
01163 }
01164 }
01165
01166 { static double _itmp31[] = { 2.95 , 0.55 , -0.39 , -1.07 , 1e3 , 1e6 ,
01167 11.};
01168 for( i=1, _r = 0; i <= 7; i++ )
01169 {
01170 CTRecombData[6][3][i-1] = _itmp31[_r++];
01171 }
01172 }
01173 { static double _itmp32[] = {1.04,3.15e-2,-0.61,-9.73,1e1,1e4,
01174 0.02};
01175 for( i=1, _r = 0; i <= 7; i++ )
01176 {
01177 CTRecombData[7][0][i-1] = _itmp32[_r++];
01178 }
01179 }
01180 { static double _itmp33[] = {1.04,0.27,2.02,-5.92,1e2,1e5,6.65};
01181 for( i=1, _r = 0; i <= 7; i++ )
01182 {
01183 CTRecombData[7][1][i-1] = _itmp33[_r++];
01184 }
01185 }
01186 { static double _itmp34[] = {3.98,0.26,0.56,-2.62,1e3,5e4,5.};
01187 for( i=1, _r = 0; i <= 7; i++ )
01188 {
01189 CTRecombData[7][2][i-1] = _itmp34[_r++];
01190 }
01191 }
01192 { static double _itmp35[] = {2.52e-1,0.63,2.08,-4.16,1e3,3e4,
01193 8.47};
01194 for( i=1, _r = 0; i <= 7; i++ )
01195 {
01196 CTRecombData[7][3][i-1] = _itmp35[_r++];
01197 }
01198 }
01199 for( i=1; i <= 7; i++ )
01200 {
01201 CTRecombData[8][0][i-1] = 0.f;
01202 }
01203 { static double _itmp36[] = {1.00e-5,0.,0.,0.,2e3,5e4,-21.37};
01204 for( i=1, _r = 0; i <= 7; i++ )
01205 {
01206 CTRecombData[8][1][i-1] = _itmp36[_r++];
01207 }
01208 }
01209 { static double _itmp37[] = {9.86,0.29,-0.21,-1.15,2e3,5e4,
01210 5.6};
01211 for( i=1, _r = 0; i <= 7; i++ )
01212 {
01213 CTRecombData[8][2][i-1] = _itmp37[_r++];
01214 }
01215 }
01216 { static double _itmp38[] = {7.15e-1,1.21,-0.70,-0.85,2e3,5e4,
01217 11.8};
01218 for( i=1, _r = 0; i <= 7; i++ )
01219 {
01220 CTRecombData[8][3][i-1] = _itmp38[_r++];
01221 }
01222 }
01223 for( i=1; i <= 7; i++ )
01224 {
01225 CTRecombData[9][0][i-1] = 0.f;
01226 }
01227 { static double _itmp39[] = {1.00e-5,0.,0.,0.,5e3,5e4,-27.36};
01228 for( i=1, _r = 0; i <= 7; i++ )
01229 {
01230 CTRecombData[9][1][i-1] = _itmp39[_r++];
01231 }
01232 }
01233 { static double _itmp40[] = {14.73,4.52e-2,-0.84,-0.31,5e3,
01234 5e4,5.82};
01235 for( i=1, _r = 0; i <= 7; i++ )
01236 {
01237 CTRecombData[9][2][i-1] = _itmp40[_r++];
01238 }
01239 }
01240 { static double _itmp41[] = {6.47,0.54,3.59,-5.22,1e3,3e4,8.60};
01241 for( i=1, _r = 0; i <= 7; i++ )
01242 {
01243 CTRecombData[9][3][i-1] = _itmp41[_r++];
01244 }
01245 }
01246 for( i=1; i <= 7; i++ )
01247 {
01248 CTRecombData[10][0][i-1] = 0.f;
01249 }
01250 { static double _itmp42[] = {1.00e-5,0.,0.,0.,2e3,5e4,-33.68};
01251 for( i=1, _r = 0; i <= 7; i++ )
01252 {
01253 CTRecombData[10][1][i-1] = _itmp42[_r++];
01254 }
01255 }
01256 { static double _itmp43[] = {1.33,1.15,1.20,-0.32,2e3,5e4,6.25};
01257 for( i=1, _r = 0; i <= 7; i++ )
01258 {
01259 CTRecombData[10][2][i-1] = _itmp43[_r++];
01260 }
01261 }
01262 { static double _itmp44[] = {1.01e-1,1.34,10.05,-6.41,2e3,5e4,
01263 11.};
01264 for( i=1, _r = 0; i <= 7; i++ )
01265 {
01266 CTRecombData[10][3][i-1] = _itmp44[_r++];
01267 }
01268 }
01269 for( i=1; i <= 7; i++ )
01270 {
01271 CTRecombData[11][0][i-1] = 0.f;
01272 }
01273 { static double _itmp45[] = {8.58e-5,2.49e-3,2.93e-2,-4.33,
01274 1e3,3e4,1.44};
01275 for( i=1, _r = 0; i <= 7; i++ )
01276 {
01277 CTRecombData[11][1][i-1] = _itmp45[_r++];
01278 }
01279 }
01280 { static double _itmp46[] = {6.49,0.53,2.82,-7.63,1e3,3e4,5.73};
01281 for( i=1, _r = 0; i <= 7; i++ )
01282 {
01283 CTRecombData[11][2][i-1] = _itmp46[_r++];
01284 }
01285 }
01286 { static double _itmp47[] = {6.36,0.55,3.86,-5.19,1e3,3e4,8.60};
01287 for( i=1, _r = 0; i <= 7; i++ )
01288 {
01289 CTRecombData[11][3][i-1] = _itmp47[_r++];
01290 }
01291 }
01292 for( i=1; i <= 7; i++ )
01293 {
01294 CTRecombData[12][0][i-1] = 0.f;
01295 }
01296 { static double _itmp48[] = {1.00e-5,0.,0.,0.,1e3,3e4,-5.23};
01297 for( i=1, _r = 0; i <= 7; i++ )
01298 {
01299 CTRecombData[12][1][i-1] = _itmp48[_r++];
01300 }
01301 }
01302 { static double _itmp49[] = {7.11e-5,4.12,1.72e4,-22.24,1e3,
01303 3e4,8.17};
01304 for( i=1, _r = 0; i <= 7; i++ )
01305 {
01306 CTRecombData[12][2][i-1] = _itmp49[_r++];
01307 }
01308 }
01309 { static double _itmp50[] = {7.52e-1,0.77,6.24,-5.67,1e3,3e4,
01310 8.};
01311 for( i=1, _r = 0; i <= 7; i++ )
01312 {
01313 CTRecombData[12][3][i-1] = _itmp50[_r++];
01314 }
01315 }
01316 for( i=1; i <= 7; i++ )
01317 {
01318 CTRecombData[13][0][i-1] = 0.f;
01319 }
01320
01321 { static double _itmp51[] = {6.77 , 7.36e-2 , -0.43 , -0.11 , 5e2 , 1e5 ,
01322 2.72};
01323 for( i=1, _r = 0; i <= 7; i++ )
01324 {
01325 CTRecombData[13][1][i-1] = _itmp51[_r++];
01326 }
01327 }
01328 { static double _itmp52[] = {4.90e-1,-8.74e-2,-0.36,-0.79,1e3,
01329 3e4,4.23};
01330 for( i=1, _r = 0; i <= 7; i++ )
01331 {
01332 CTRecombData[13][2][i-1] = _itmp52[_r++];
01333 }
01334 }
01335 { static double _itmp53[] = {7.58,0.37,1.06,-4.09,1e3,5e4,7.49};
01336 for( i=1, _r = 0; i <= 7; i++ )
01337 {
01338 CTRecombData[13][3][i-1] = _itmp53[_r++];
01339 }
01340 }
01341 for( i=1; i <= 7; i++ )
01342 {
01343 CTRecombData[14][0][i-1] = 0.f;
01344 }
01345 { static double _itmp54[] = {1.74e-4,3.84,36.06,-0.97,1e3,3e4,
01346 3.45};
01347 for( i=1, _r = 0; i <= 7; i++ )
01348 {
01349 CTRecombData[14][1][i-1] = _itmp54[_r++];
01350 }
01351 }
01352 { static double _itmp55[] = {9.46e-2,-5.58e-2,0.77,-6.43,1e3,
01353 3e4,7.29};
01354 for( i=1, _r = 0; i <= 7; i++ )
01355 {
01356 CTRecombData[14][2][i-1] = _itmp55[_r++];
01357 }
01358 }
01359 { static double _itmp56[] = {5.37,0.47,2.21,-8.52,1e3,3e4,9.71};
01360 for( i=1, _r = 0; i <= 7; i++ )
01361 {
01362 CTRecombData[14][3][i-1] = _itmp56[_r++];
01363 }
01364 }
01365 { static double _itmp57[] = {3.82e-7,11.10,2.57e4,-8.22,1e3,
01366 1e4,-3.24};
01367 for( i=1, _r = 0; i <= 7; i++ )
01368 {
01369 CTRecombData[15][0][i-1] = _itmp57[_r++];
01370 }
01371 }
01372 { static double _itmp58[] = {1.00e-5,0.,0.,0.,1e3,3e4,-9.73};
01373 for( i=1, _r = 0; i <= 7; i++ )
01374 {
01375 CTRecombData[15][1][i-1] = _itmp58[_r++];
01376 }
01377 }
01378 { static double _itmp59[] = {2.29,4.02e-2,1.59,-6.06,1e3,3e4,
01379 5.73};
01380 for( i=1, _r = 0; i <= 7; i++ )
01381 {
01382 CTRecombData[15][2][i-1] = _itmp59[_r++];
01383 }
01384 }
01385 { static double _itmp60[] = {6.44,0.13,2.69,-5.69,1e3,3e4,8.60};
01386 for( i=1, _r = 0; i <= 7; i++ )
01387 {
01388 CTRecombData[15][3][i-1] = _itmp60[_r++];
01389 }
01390 }
01391 for( i=1; i <= 7; i++ )
01392 {
01393 CTRecombData[16][0][i-1] = 0.f;
01394 }
01395 { static double _itmp61[] = {1.00e-5,0.,0.,0.,1e3,3e4,-10.21};
01396 for( i=1, _r = 0; i <= 7; i++ )
01397 {
01398 CTRecombData[16][1][i-1] = _itmp61[_r++];
01399 }
01400 }
01401 { static double _itmp62[] = {1.88,0.32,1.77,-5.70,1e3,3e4,8.};
01402 for( i=1, _r = 0; i <= 7; i++ )
01403 {
01404 CTRecombData[16][2][i-1] = _itmp62[_r++];
01405 }
01406 }
01407 { static double _itmp63[] = {7.27,0.29,1.04,-10.14,1e3,3e4,
01408 9.};
01409 for( i=1, _r = 0; i <= 7; i++ )
01410 {
01411 CTRecombData[16][3][i-1] = _itmp63[_r++];
01412 }
01413 }
01414 for( i=1; i <= 7; i++ )
01415 {
01416 CTRecombData[17][0][i-1] = 0.f;
01417 }
01418 { static double _itmp64[] = {1.00e-5,0.,0.,0.,1e3,3e4,-14.03};
01419 for( i=1, _r = 0; i <= 7; i++ )
01420 {
01421 CTRecombData[17][1][i-1] = _itmp64[_r++];
01422 }
01423 }
01424 { static double _itmp65[] = {4.57,0.27,-0.18,-1.57,1e3,3e4,
01425 5.73};
01426 for( i=1, _r = 0; i <= 7; i++ )
01427 {
01428 CTRecombData[17][2][i-1] = _itmp65[_r++];
01429 }
01430 }
01431 { static double _itmp66[] = {6.37,0.85,10.21,-6.22,1e3,3e4,
01432 8.60};
01433 for( i=1, _r = 0; i <= 7; i++ )
01434 {
01435 CTRecombData[17][3][i-1] = _itmp66[_r++];
01436 }
01437 }
01438 for( i=1; i <= 7; i++ )
01439 {
01440 CTRecombData[18][0][i-1] = 0.f;
01441 }
01442 { static double _itmp67[] = {1.00e-5,0.,0.,0.,1e3,3e4,-18.02};
01443 for( i=1, _r = 0; i <= 7; i++ )
01444 {
01445 CTRecombData[18][1][i-1] = _itmp67[_r++];
01446 }
01447 }
01448 { static double _itmp68[] = {4.76,0.44,-0.56,-0.88,1e3,3e4,
01449 6.};
01450 for( i=1, _r = 0; i <= 7; i++ )
01451 {
01452 CTRecombData[18][2][i-1] = _itmp68[_r++];
01453 }
01454 }
01455 { static double _itmp69[] = {1.00e-5,0.,0.,0.,1e3,3e4,-47.3};
01456 for( i=1, _r = 0; i <= 7; i++ )
01457 {
01458 CTRecombData[18][3][i-1] = _itmp69[_r++];
01459 }
01460 }
01461 for( i=1; i <= 7; i++ )
01462 {
01463 CTRecombData[19][0][i-1] = 0.f;
01464 }
01465 { static double _itmp70[] = {0.,0.,0.,0.,1e1,1e9,0.};
01466 for( i=1, _r = 0; i <= 7; i++ )
01467 {
01468 CTRecombData[19][1][i-1] = _itmp70[_r++];
01469 }
01470 }
01471 { static double _itmp71[] = {3.17e-2,2.12,12.06,-0.40,1e3,3e4,
01472 6.6};
01473 for( i=1, _r = 0; i <= 7; i++ )
01474 {
01475 CTRecombData[19][2][i-1] = _itmp71[_r++];
01476 }
01477 }
01478 { static double _itmp72[] = {2.68,0.69,-0.68,-4.47,1e3,3e4,
01479 9.9};
01480 for( i=1, _r = 0; i <= 7; i++ )
01481 {
01482 CTRecombData[19][3][i-1] = _itmp72[_r++];
01483 }
01484 }
01485 for( i=1; i <= 7; i++ )
01486 {
01487 CTRecombData[20][0][i-1] = 0.f;
01488 }
01489 { static double _itmp73[] = {0.,0.,0.,0.,1e1,1e9,0.};
01490 for( i=1, _r = 0; i <= 7; i++ )
01491 {
01492 CTRecombData[20][1][i-1] = _itmp73[_r++];
01493 }
01494 }
01495 { static double _itmp74[] = {7.22e-3,2.34,411.50,-13.24,1e3,
01496 3e4,3.5};
01497 for( i=1, _r = 0; i <= 7; i++ )
01498 {
01499 CTRecombData[20][2][i-1] = _itmp74[_r++];
01500 }
01501 }
01502 { static double _itmp75[] = {1.20e-1,1.48,4.00,-9.33,1e3,3e4,
01503 10.61};
01504 for( i=1, _r = 0; i <= 7; i++ )
01505 {
01506 CTRecombData[20][3][i-1] = _itmp75[_r++];
01507 }
01508 }
01509 for( i=1; i <= 7; i++ )
01510 {
01511 CTRecombData[21][0][i-1] = 0.f;
01512 }
01513 { static double _itmp76[] = {0.,0.,0.,0.,1e1,1e9,0.};
01514 for( i=1, _r = 0; i <= 7; i++ )
01515 {
01516 CTRecombData[21][1][i-1] = _itmp76[_r++];
01517 }
01518 }
01519 { static double _itmp77[] = {6.34e-1,6.87e-3,0.18,-8.04,1e3,
01520 3e4,4.3};
01521 for( i=1, _r = 0; i <= 7; i++ )
01522 {
01523 CTRecombData[21][2][i-1] = _itmp77[_r++];
01524 }
01525 }
01526 { static double _itmp78[] = {4.37e-3,1.25,40.02,-8.05,1e3,3e4,
01527 5.3};
01528 for( i=1, _r = 0; i <= 7; i++ )
01529 {
01530 CTRecombData[21][3][i-1] = _itmp78[_r++];
01531 }
01532 }
01533 for( i=1; i <= 7; i++ )
01534 {
01535 CTRecombData[22][0][i-1] = 0.f;
01536 }
01537 { static double _itmp79[] = {1.00e-5,0.,0.,0.,1e3,3e4,-1.05};
01538 for( i=1, _r = 0; i <= 7; i++ )
01539 {
01540 CTRecombData[22][1][i-1] = _itmp79[_r++];
01541 }
01542 }
01543 { static double _itmp80[] = {5.12,-2.18e-2,-0.24,-0.83,1e3,
01544 3e4,4.7};
01545 for( i=1, _r = 0; i <= 7; i++ )
01546 {
01547 CTRecombData[22][2][i-1] = _itmp80[_r++];
01548 }
01549 }
01550 { static double _itmp81[] = {1.96e-1,-8.53e-3,0.28,-6.46,1e3,
01551 3e4,6.2};
01552 for( i=1, _r = 0; i <= 7; i++ )
01553 {
01554 CTRecombData[22][3][i-1] = _itmp81[_r++];
01555 }
01556 }
01557 for( i=1; i <= 7; i++ )
01558 {
01559 CTRecombData[23][0][i-1] = 0.f;
01560 }
01561 { static double _itmp82[] = {5.27e-1,0.61,-0.89,-3.56,1e3,3e4,
01562 2.89};
01563 for( i=1, _r = 0; i <= 7; i++ )
01564 {
01565 CTRecombData[23][1][i-1] = _itmp82[_r++];
01566 }
01567 }
01568 { static double _itmp83[] = {10.90,0.24,0.26,-11.94,1e3,3e4,
01569 5.4};
01570 for( i=1, _r = 0; i <= 7; i++ )
01571 {
01572 CTRecombData[23][2][i-1] = _itmp83[_r++];
01573 }
01574 }
01575 { static double _itmp84[] = {1.18,0.20,0.77,-7.09,1e3,3e4,6.6};
01576 for( i=1, _r = 0; i <= 7; i++ )
01577 {
01578 CTRecombData[23][3][i-1] = _itmp84[_r++];
01579 }
01580 }
01581 for( i=1; i <= 7; i++ )
01582 {
01583 CTRecombData[24][0][i-1] = 0.f;
01584 }
01585 { static double _itmp85[] = {1.65e-1,6.80e-3,6.44e-2,-9.70,
01586 1e3,3e4,2.04};
01587 for( i=1, _r = 0; i <= 7; i++ )
01588 {
01589 CTRecombData[24][1][i-1] = _itmp85[_r++];
01590 }
01591 }
01592 { static double _itmp86[] = {14.20,0.34,-0.41,-1.19,1e3,3e4,
01593 6.};
01594 for( i=1, _r = 0; i <= 7; i++ )
01595 {
01596 CTRecombData[24][2][i-1] = _itmp86[_r++];
01597 }
01598 }
01599 { static double _itmp87[] = {4.43e-1,0.91,10.76,-7.49,1e3,3e4,
01600 7.};
01601 for( i=1, _r = 0; i <= 7; i++ )
01602 {
01603 CTRecombData[24][3][i-1] = _itmp87[_r++];
01604 }
01605 }
01606 for( i=1; i <= 7; i++ )
01607 {
01608 CTRecombData[25][0][i-1] = 0.f;
01609 }
01610 { static double _itmp88[] = {1.26,7.72e-2,-0.41,-7.31,1e3,1e5,
01611 2.56};
01612 for( i=1, _r = 0; i <= 7; i++ )
01613 {
01614 CTRecombData[25][1][i-1] = _itmp88[_r++];
01615 }
01616 }
01617 { static double _itmp89[] = {3.42,0.51,-2.06,-8.99,1e3,1e5,
01618 6.3};
01619 for( i=1, _r = 0; i <= 7; i++ )
01620 {
01621 CTRecombData[25][2][i-1] = _itmp89[_r++];
01622 }
01623 }
01624 { static double _itmp90[] = {14.60,3.57e-2,-0.92,-0.37,1e3,
01625 3e4,10.};
01626 for( i=1, _r = 0; i <= 7; i++ )
01627 {
01628 CTRecombData[25][3][i-1] = _itmp90[_r++];
01629 }
01630 }
01631 for( i=1; i <= 7; i++ )
01632 {
01633 CTRecombData[26][0][i-1] = 0.f;
01634 }
01635 { static double _itmp91[] = {5.30,0.24,-0.91,-0.47,1e3,3e4,
01636 2.9};
01637 for( i=1, _r = 0; i <= 7; i++ )
01638 {
01639 CTRecombData[26][1][i-1] = _itmp91[_r++];
01640 }
01641 }
01642 { static double _itmp92[] = {3.26,0.87,2.85,-9.23,1e3,3e4,6.};
01643 for( i=1, _r = 0; i <= 7; i++ )
01644 {
01645 CTRecombData[26][2][i-1] = _itmp92[_r++];
01646 }
01647 }
01648 { static double _itmp93[] = {1.03,0.58,-0.89,-0.66,1e3,3e4,
01649 10.51};
01650 for( i=1, _r = 0; i <= 7; i++ )
01651 {
01652 CTRecombData[26][3][i-1] = _itmp93[_r++];
01653 }
01654 }
01655 for( i=1; i <= 7; i++ )
01656 {
01657 CTRecombData[27][0][i-1] = 0.f;
01658 }
01659 { static double _itmp94[] = {1.05,1.28,6.54,-1.81,1e3,1e5,3.0};
01660 for( i=1, _r = 0; i <= 7; i++ )
01661 {
01662 CTRecombData[27][1][i-1] = _itmp94[_r++];
01663 }
01664 }
01665 { static double _itmp95[] = {9.73,0.35,0.90,-5.33,1e3,3e4,5.2};
01666 for( i=1, _r = 0; i <= 7; i++ )
01667 {
01668 CTRecombData[27][2][i-1] = _itmp95[_r++];
01669 }
01670 }
01671 { static double _itmp96[] = {6.14,0.25,-0.91,-0.42,1e3,3e4,
01672 10.};
01673 for( i=1, _r = 0; i <= 7; i++ )
01674 {
01675 CTRecombData[27][3][i-1] = _itmp96[_r++];
01676 }
01677 }
01678 for( i=1; i <= 7; i++ )
01679 {
01680 CTRecombData[28][0][i-1] = 0.f;
01681 }
01682 { static double _itmp97[] = {1.47e-3,3.51,23.91,-0.93,1e3,3e4,
01683 3.44};
01684 for( i=1, _r = 0; i <= 7; i++ )
01685 {
01686 CTRecombData[28][1][i-1] = _itmp97[_r++];
01687 }
01688 }
01689 { static double _itmp98[] = {9.26,0.37,0.40,-10.73,1e3,3e4,
01690 5.6};
01691 for( i=1, _r = 0; i <= 7; i++ )
01692 {
01693 CTRecombData[28][2][i-1] = _itmp98[_r++];
01694 }
01695 }
01696 { static double _itmp99[] = {11.59,0.20,0.80,-6.62,1e3,3e4,
01697 9.};
01698 for( i=1, _r = 0; i <= 7; i++ )
01699 {
01700 CTRecombData[28][3][i-1] = _itmp99[_r++];
01701 }
01702 }
01703 for( i=1; i <= 7; i++ )
01704 {
01705 CTRecombData[29][0][i-1] = 0.f;
01706 }
01707 { static double _itmp100[] = {1.00e-5,0.,0.,0.,1e3,3e4,-4.37};
01708 for( i=1, _r = 0; i <= 7; i++ )
01709 {
01710 CTRecombData[29][1][i-1] = _itmp100[_r++];
01711 }
01712 }
01713 { static double _itmp101[] = {6.96e-4,4.24,26.06,-1.24,1e3,
01714 3e4,7.8};
01715 for( i=1, _r = 0; i <= 7; i++ )
01716 {
01717 CTRecombData[29][2][i-1] = _itmp101[_r++];
01718 }
01719 }
01720 { static double _itmp102[] = {1.33e-2,1.56,-0.92,-1.20,1e3,
01721 3e4,11.73};
01722 for( i=1, _r = 0; i <= 7; i++ )
01723 {
01724 CTRecombData[29][3][i-1] = _itmp102[_r++];
01725 }
01726 }
01727 }
01728
01729
01730 void ChargTranPun( FILE* ipPnunit , char* chSave )
01731 {
01732 long int j, jj;
01733
01734 double TempSave = phycon.te;
01735
01736 DEBUG_ENTRY( "ChargTranPun()" );
01737
01738
01739 if( strcmp( chSave,"CHAR") == 0 )
01740 {
01741
01742
01743
01744
01745
01746
01747
01748 fprintf( ipPnunit, "#element\tion\n");
01749 for( j=1; j < LIMELM; j++ )
01750 {
01751
01752
01753 fprintf( ipPnunit, "%s\t", elementnames.chElementSym[j] );
01754
01755
01756 for( jj=0; jj < j; jj++ )
01757 {
01758 fprintf( ipPnunit, "%.2e\t",
01759 HCTRecom(jj,j) );
01760 }
01761 fprintf( ipPnunit, "\n" );
01762 }
01763
01764
01765
01766 fprintf( ipPnunit, "\n#ionization rates, atomic number\n");
01767 for( j=1; j < LIMELM; j++ )
01768 {
01769 fprintf( ipPnunit, "%s\t", elementnames.chElementSym[j] );
01770 for( jj=0; jj < j; jj++ )
01771 {
01772 fprintf( ipPnunit, "%.2e\t",
01773 HCTIon(jj,j) );
01774 }
01775 fprintf( ipPnunit, "\n" );
01776 }
01777 }
01778
01779
01780
01781 else if( strcmp( chSave,"CHAG") == 0 )
01782 {
01783
01784 double BreakEnergy = 100./13.0;
01785 double OHRate;
01786 realnum teinit = 5000.;
01787 realnum tefinal = 20000.;
01788 realnum te1;
01789 long int nelem, ion;
01790
01791 te1 = teinit;
01792 fprintf(ipPnunit,"H ioniz\n X+i\\Te");
01793 while( te1 <= tefinal )
01794 {
01795 fprintf(ipPnunit,"\t%.0f K",te1);
01796 te1 *= 2.;
01797 }
01798 fprintf(ipPnunit,"\n");
01799
01800
01801 ChargTranEval(&OHRate);
01802
01803
01804 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
01805 {
01806
01807 if( abund.lgAGN[nelem] )
01808 {
01809 for( ion=0; ion<=nelem; ++ion )
01810 {
01811
01812 if( Heavy.Valence_IP_Ryd[nelem][ion] > BreakEnergy )
01813 break;
01814
01815 if( atmdat.HCharExcIonOf[nelem][ion] == 0 )
01816 continue;
01817
01818
01819 fprintf(ipPnunit,"%s",
01820 elementnames.chElementSym[nelem]);
01821
01822 if( ion==0 )
01823 {
01824 fprintf(ipPnunit,"0 ");
01825 }
01826 else if( ion==1 )
01827 {
01828 fprintf(ipPnunit,"+ ");
01829 }
01830 else
01831 {
01832 fprintf(ipPnunit,"+%li",ion);
01833 }
01834
01835
01836 TempChange(teinit , false);
01837
01838 while( phycon.te <= tefinal )
01839 {
01840 dense.IonLow[nelem] = 0;
01841 dense.IonHigh[nelem] = nelem+1;
01842 ChargTranEval(&OHRate);
01843
01844 fprintf(ipPnunit,"\t%.2e",atmdat.HCharExcIonOf[nelem][ion]);
01845 TempChange(phycon.te *2.f , false);
01846 }
01847 fprintf(ipPnunit,"\n");
01848 }
01849 fprintf(ipPnunit,"\n");
01850 }
01851 }
01852
01853 te1 = teinit;
01854 fprintf(ipPnunit,"H recom\n X+i\\Te");
01855 while( te1 <= tefinal )
01856 {
01857 fprintf(ipPnunit,"\t%.0f K",te1);
01858 te1 *= 2.;
01859 }
01860 fprintf(ipPnunit,"\n");
01861
01862
01863 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
01864 {
01865
01866 if( abund.lgAGN[nelem] )
01867 {
01868 for( ion=0; ion<=nelem; ++ion )
01869 {
01870
01871 if( Heavy.Valence_IP_Ryd[nelem][ion] > BreakEnergy )
01872 break;
01873
01874 if( atmdat.HCharExcRecTo[nelem][ion] == 0 )
01875 continue;
01876
01877
01878 fprintf(ipPnunit,"%s",
01879 elementnames.chElementSym[nelem]);
01880
01881 if( ion==0 )
01882 {
01883 fprintf(ipPnunit,"0 ");
01884 }
01885 else if( ion==1 )
01886 {
01887 fprintf(ipPnunit,"+ ");
01888 }
01889 else
01890 {
01891 fprintf(ipPnunit,"+%li",ion);
01892 }
01893
01894
01895 TempChange(teinit , false);
01896 while( phycon.te <= tefinal )
01897 {
01898 dense.IonLow[nelem] = 0;
01899 dense.IonHigh[nelem] = nelem+1;
01900 ChargTranEval(&OHRate);
01901
01902 fprintf(ipPnunit,"\t%.2e",atmdat.HCharExcRecTo[nelem][ion]);
01903 TempChange(phycon.te *2.f , false);
01904 }
01905 fprintf(ipPnunit,"\n");
01906 }
01907 fprintf(ipPnunit,"\n");
01908 }
01909 }
01910
01911 # if 0
01912 te1 = teinit;
01913 fprintf(ipPnunit,"He recom\n Elem\\Te");
01914 while( te1 <= tefinal )
01915 {
01916 fprintf(ipPnunit,"\t%.0f",te1);
01917 te1 *= 2.;
01918 }
01919 fprintf(ipPnunit,"\n");
01920
01921
01922 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
01923 {
01924
01925 if( abund.lgAGN[nelem] )
01926 {
01927 for( ion=0; ion<=nelem; ++ion )
01928 {
01929
01930 if( atmdat.HeCharExcRecTo[nelem][ion] == 0 )
01931 continue;
01932 fprintf(ipPnunit,"%.2s%.2s",
01933 elementnames.chElementSym[nelem],
01934 elementnames.chIonStage[ion]);
01935
01936
01937 TempChange(teinit , false);
01938 while( phycon.te <= tefinal )
01939 {
01940 dense.IonLow[nelem] = 0;
01941 dense.IonHigh[nelem] = nelem+1;
01942 ChargTranEval();
01943
01944 fprintf(ipPnunit,"\t%.2e",atmdat.HeCharExcRecTo[nelem][ion]);
01945 TempChange(phycon.te *2.fprintf , false);
01946 }
01947 fprintf(ipPnunit,"\n");
01948 }
01949 fprintf(ipPnunit,"\n");
01950 }
01951 }
01952
01953
01954 te1 = teinit;
01955 fprintf(ipPnunit,"He ioniz\n Elem\\Te");
01956 while( te1 <= tefinal )
01957 {
01958 fprintf(ipPnunit,"\t%.0f",te1);
01959 te1 *= 2.;
01960 }
01961 fprintf(ipPnunit,"\n");
01962
01963
01964 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
01965 {
01966
01967 if( abund.lgAGN[nelem] )
01968 {
01969 for( ion=0; ion<=nelem; ++ion )
01970 {
01971
01972 if( atmdat.HeCharExcIonOf[nelem][ion] == 0 )
01973 continue;
01974 fprintf(ipPnunit,"%.2s%.2s",
01975 elementnames.chElementSym[nelem],
01976 elementnames.chIonStage[ion]);
01977
01978
01979 TempChange(teinit , false);
01980 while( phycon.te <= tefinal )
01981 {
01982 dense.IonLow[nelem] = 0;
01983 dense.IonHigh[nelem] = nelem+1;
01984 ChargTranEval();
01985
01986 fprintf(ipPnunit,"\t%.2e",atmdat.HeCharExcIonOf[nelem][ion]);
01987 TempChange(phycon.te*2.f , true);
01988 }
01989 fprintf(ipPnunit,"\n");
01990 }
01991 fprintf(ipPnunit,"\n");
01992 }
01993 }
01994 # endif
01995 }
01996 else
01997 {
01998 fprintf( ioQQQ, " save charge keyword insane\n" );
01999 cdEXIT(EXIT_FAILURE);
02000 }
02001
02002 TempChange(TempSave , false);
02003 return;
02004 }