00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "cddefines.h"
00012 #include "taulines.h"
00013 #include "opacity.h"
00014 #include "dense.h"
00015 #include "iso.h"
00016 #include "mole.h"
00017 #include "hmi.h"
00018 #include "h2.h"
00019 #include "rfield.h"
00020 #include "conv.h"
00021 #include "rt.h"
00022 #include "atomfeii.h"
00023 #include "heavy.h"
00024 #include "he.h"
00025 #include "trace.h"
00026
00027
00028 static int nOTS_Line_type = -1;
00029 static int nOTS1=-1 , nOTS2=-1;
00030
00031 STATIC void RT_OTS_AddCont(
00032
00033 realnum ots,
00034
00035 long int ip);
00036
00037
00038
00039 void RT_OTS(void)
00040 {
00041 long int
00042 ipla,
00043 ipISO ,
00044 nelem,
00045 n;
00046 realnum
00047 difflya,
00048 esc,
00049 ots;
00050
00051
00052
00053 const realnum BOWEN = 0.5f;
00054 long int ipHi,
00055 ipLo;
00056
00057 double bwnfac;
00058 double ots660;
00059 realnum cont_phot_destroyed;
00060 double save_lya_dest,
00061 save_he2lya_dest;
00062
00063 double save_he2rec_dest;
00064
00065
00066
00067
00068
00069 DEBUG_ENTRY( "RT_OTS()" );
00070
00071 for( long i=0; i < rfield.nflux; i++ )
00072 {
00073 rfield.otslin[i] = 0.;
00074 rfield.otscon[i] = 0.;
00075 }
00076
00077
00078
00079
00080
00081
00082 nOTS_Line_type = 0;
00083 nelem = ipHELIUM;
00084 if( dense.lgElmtOn[nelem] )
00085 {
00086
00087
00088 bwnfac = BOWEN * MAX2(0.f,1.f- iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Pesc() -
00089 iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Pelec_esc() );
00090
00091
00092
00093 ots660 = iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Aul()*
00094 iso_sp[ipH_LIKE][nelem].st[ipH2p].Pop()*
00095
00096 iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Pdest() *BOWEN*2.0;
00097
00098
00099 if( ots660 > SMALLFLOAT )
00100 RT_OTS_AddLine(ots660 , he.ip660 );
00101
00102
00103
00104 iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Pdest() *= (realnum)bwnfac;
00105 ASSERT( iso_sp[ipH_LIKE][nelem].trans(ipH2p,ipH1s).Emis().Pdest() >= 0. );
00106 {
00107
00108
00109 enum {DEBUG_LOC=false};
00110 if( DEBUG_LOC )
00111 {
00112 fprintf(ioQQQ,"DEBUG HeII Bowen nzone %li bwnfac:%.2e bwnfac esc:%.2e ots660 %.2e\n",
00113 nzone,
00114 bwnfac ,
00115 bwnfac/BOWEN ,
00116 ots660 );
00117 }
00118 }
00119 }
00120
00121 else
00122 {
00123 bwnfac = 1.;
00124 }
00125
00126
00127 save_lya_dest = iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).Emis().Pdest();
00128
00129
00130
00131
00132 iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).Emis().Pdest() *= rfield.lgLyaOTS;
00133
00134
00135 save_he2lya_dest = iso_sp[ipH_LIKE][ipHELIUM].trans(ipH2p,ipH1s).Emis().Pdest();
00136 iso_sp[ipH_LIKE][ipHELIUM].trans(ipH2p,ipH1s).Emis().Pdest() *= rfield.lgHeIIOTS;
00137
00138
00139 save_he2rec_dest = iso_sp[ipH_LIKE][ipHELIUM].fb[ipH1s].RadRecomb[ipRecRad];
00140 iso_sp[ipH_LIKE][ipHELIUM].fb[ipH1s].RadRecomb[ipRecRad] *= rfield.lgHeIIOTS;
00141
00142 nOTS_Line_type = 1;
00143
00144
00145
00146
00147 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00148 {
00149 for( nelem=ipISO; nelem < LIMELM; nelem++ )
00150 {
00151 nOTS1 = ipISO;
00152 nOTS2 = nelem;
00153
00157 if( (dense.IonHigh[nelem] >= nelem+1-ipISO ) )
00158 {
00159
00160
00161
00162
00163 for( ipHi=1; ipHi < iso_sp[ipISO][nelem].numLevels_local; ipHi++ )
00164 {
00165 for( ipLo=0; ipLo < ipHi; ipLo++ )
00166 {
00167
00168
00169
00170 if( iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont() < 1 ||
00171 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Pdest()<= DEST0 )
00172 continue;
00173
00174
00175 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().ots() =
00176 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul()*
00177 iso_sp[ipISO][nelem].st[ipHi].Pop()*
00178 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Pdest();
00179
00180 ASSERT( iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().ots() >= 0. );
00181
00182
00183
00184
00185
00186
00187
00188 if( iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().ots() > SMALLFLOAT )
00189 RT_OTS_AddLine(iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().ots(),
00190 iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont() );
00191 }
00192 }
00193 {
00194
00195
00196
00197 enum {DEBUG_LOC=false};
00198
00199 if( DEBUG_LOC )
00200 {
00201 long ip;
00202 if( ipISO==0 && nelem==0 && nzone>500 )
00203 {
00204 ipHi = 2;
00205 ipLo = 0;
00206 ip = iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont();
00207 fprintf(ioQQQ,"DEBUG hlyaots\t%.2f\tEdenTrue\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
00208 fnzone,
00209 dense.EdenTrue ,
00210 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().ots(),
00211 opac.opacity_abs[ip-1],
00212 iso_sp[ipISO][nelem].st[ipHi].Pop(),
00213 dense.xIonDense[nelem][nelem+1-ipISO],
00214 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Pdest(),
00215 rfield.otslin[ip-1]);
00216 }
00217 }
00218 }
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228 for( n=0; n < iso_sp[ipISO][nelem].numLevels_local; n++ )
00229 {
00230 cont_phot_destroyed = (realnum)(iso_sp[ipISO][nelem].fb[n].RadRecomb[ipRecRad]*
00231 (1. - iso_sp[ipISO][nelem].fb[n].RadRecomb[ipRecEsc])*dense.eden*
00232 dense.xIonDense[nelem][nelem+1-ipISO]);
00233 ASSERT( cont_phot_destroyed >= 0. );
00234
00235
00236 RT_OTS_AddCont(cont_phot_destroyed,iso_sp[ipISO][nelem].fb[n].ipIsoLevNIonCon);
00237
00238 {
00239
00240 enum {DEBUG_LOC=false};
00241
00242 if( DEBUG_LOC && nzone > 400 && nelem==0 && n==2 )
00243 {
00244 long ip = iso_sp[ipISO][nelem].fb[n].ipIsoLevNIonCon-1;
00245 fprintf(ioQQQ,"hotsdebugg\t%.3f\t%li\th con ots\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
00246 fnzone,
00247 n ,
00248 iso_sp[ipISO][nelem].st[n].Pop(),
00249 cont_phot_destroyed,
00250 cont_phot_destroyed/opac.opacity_abs[ip],
00251 rfield.otscon[ip] ,
00252 opac.opacity_abs[ip] ,
00253 findspecieslocal("H-")->den ,
00254 hmi.HMinus_photo_rate);
00255 }
00256 }
00257 }
00258 }
00259 }
00260 }
00261
00262 {
00263 enum {DEBUG_LOC=false};
00264 if( DEBUG_LOC )
00265 {
00266 nelem = 0;
00267 fprintf(ioQQQ,"hotsdebugg %li \t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
00268 nzone,
00269 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[0].ipIsoLevNIonCon-1],
00270 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[1].ipIsoLevNIonCon-1],
00271 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[3].ipIsoLevNIonCon-1],
00272 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[4].ipIsoLevNIonCon-1],
00273 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[5].ipIsoLevNIonCon-1],
00274 rfield.otscon[iso_sp[ipH_LIKE][nelem].fb[6].ipIsoLevNIonCon-1],
00275 opac.opacity_abs[iso_sp[ipH_LIKE][nelem].fb[6].ipIsoLevNIonCon-1]);
00276 }
00277 }
00278
00279
00280 iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).Emis().Pdest() = (realnum)save_lya_dest;
00281 iso_sp[ipH_LIKE][ipHELIUM].trans(ipH2p,ipH1s).Emis().Pdest() = (realnum)save_he2lya_dest;
00282 iso_sp[ipH_LIKE][ipHELIUM].fb[ipH1s].RadRecomb[ipRecRad] = save_he2rec_dest;
00283
00284 nelem = ipHELIUM;
00285 if( dense.lgElmtOn[nelem] && bwnfac > 0. )
00286 {
00287
00288 iso_sp[ipH_LIKE][ipHELIUM].trans(ipH2p,ipH1s).Emis().Pdest() /= (realnum)bwnfac;
00289 }
00290
00291 if( trace.lgTrace )
00292 {
00293 fprintf(ioQQQ," RT_OTS Pdest %.2e ots rate %.2e in otslin %.2e con opac %.2e\n",
00294 iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).Emis().Pdest(),
00295 iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).Emis().ots() ,
00296 rfield.otslin[iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).ipCont()-1] ,
00297 opac.opacity_abs[iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).ipCont()-1]
00298 );
00299 }
00300
00301 nOTS_Line_type = 2;
00302
00303 for( nelem=NISO; nelem < LIMELM; nelem++ )
00304 {
00305 long int ion;
00306
00307
00308 for( ion=0; ion < nelem+1-NISO; ion++ )
00309 {
00310 if( dense.xIonDense[nelem][ion+1] > 0. )
00311 {
00312 nOTS1 = nelem;
00313 nOTS2 = ion;
00314
00315 ipla = Heavy.ipLyHeavy[nelem][ion];
00316 ASSERT( ipla>0 );
00317 esc = opac.ExpmTau[ipla-1];
00318
00319 difflya = Heavy.xLyaHeavy[nelem][ion]*dense.xIonDense[nelem][ion+1];
00320
00321
00322 ots = difflya*MAX2(0.f,1.f-esc);
00323
00324
00325 ASSERT( ots >= 0.);
00326
00327
00328
00329
00330 if( ots > SMALLFLOAT )
00331 RT_OTS_AddLine(ots,ipla);
00332
00333
00334 ipla = Heavy.ipBalHeavy[nelem][ion];
00335 esc = opac.ExpmTau[ipla-1];
00336
00337 difflya = Heavy.xLyaHeavy[nelem][ion]*dense.xIonDense[nelem][ion+1];
00338
00339
00340 ots = difflya*MAX2(0.f,1.f-esc);
00341 ASSERT( ots >= 0.);
00342
00343
00344 if( ots > SMALLFLOAT )
00345 RT_OTS_AddLine(ots,ipla);
00346 }
00347 }
00348 }
00349
00350 nOTS_Line_type = 3;
00351
00352 FeII_OTS();
00353
00354 nOTS_Line_type = 4;
00355
00356 for( nOTS1=1; nOTS1 < nLevel1; nOTS1++ )
00357 {
00358 TauLines[nOTS1].Emis().ots() = (*TauLines[nOTS1].Hi()).Pop() * TauLines[nOTS1].Emis().Aul() * TauLines[nOTS1].Emis().Pdest();
00359 if( TauLines[nOTS1].Emis().ots() > SMALLFLOAT )
00360 RT_OTS_AddLine( TauLines[nOTS1].Emis().ots() , TauLines[nOTS1].ipCont());
00361 }
00362
00363 nOTS_Line_type = 5;
00364
00365 for( nOTS1=0; nOTS1 < nWindLine; nOTS1++ )
00366 {
00367 if( (*TauLine2[nOTS1].Hi()).IonStg() < (*TauLine2[nOTS1].Hi()).nelem()+1-NISO )
00368 {
00369 TauLine2[nOTS1].Emis().ots() = (*TauLine2[nOTS1].Hi()).Pop() * TauLine2[nOTS1].Emis().Aul() * TauLine2[nOTS1].Emis().Pdest();
00370 if( TauLine2[nOTS1].Emis().ots() > SMALLFLOAT )
00371 RT_OTS_AddLine( TauLine2[nOTS1].Emis().ots() , TauLine2[nOTS1].ipCont());
00372 }
00373 }
00374
00375 nOTS_Line_type = 6;
00376 for( long ipSpecies=0; ipSpecies<nSpecies; ipSpecies++ )
00377 {
00378 if( dBaseSpecies[ipSpecies].lgActive )
00379 {
00380 for(TransitionList::iterator tr = dBaseTrans[ipSpecies].begin();
00381 tr != dBaseTrans[ipSpecies].end(); ++tr)
00382 {
00383 int ipHi = (*tr).ipHi();
00384 if (ipHi >= dBaseSpecies[ipSpecies].numLevels_local || (*tr).ipCont() <= 0)
00385 continue;
00386 (*tr).Emis().ots() = (*(*tr).Hi()).Pop() * (*tr).Emis().Aul() * (*tr).Emis().Pdest();
00387 RT_OTS_AddLine( (*tr).Emis().ots() , (*tr).ipCont());
00388 }
00389 }
00390 }
00391
00392 nOTS_Line_type = 7;
00393
00394 for( diatom_iter diatom = diatoms.begin(); diatom != diatoms.end(); ++diatom )
00395 (*diatom)->H2_RT_OTS();
00396
00397 return;
00398 }
00399
00400
00401
00402 void RT_OTS_AddLine(double ots,
00403
00404 long int ip )
00405 {
00406
00407 DEBUG_ENTRY( "RT_OTS_AddLine()" );
00408
00409
00410
00411
00412
00413 if( ip==0 || ip > rfield.nflux )
00414 {
00415 return;
00416 }
00417
00418
00419 ASSERT( ots >= 0. );
00420
00421 ASSERT( ip > 0 );
00422
00423
00424
00425
00426 if( opac.opacity_abs[ip-1] > 0. )
00427 {
00428 rfield.otslin[ip-1] += (realnum)(ots/opac.opacity_abs[ip-1]);
00429 }
00430
00431 {
00432 enum {DEBUG_LOC=false};
00433 if( DEBUG_LOC && ip== 2363 )
00434 {
00435 fprintf(ioQQQ,"DEBUG ots, opc, otsr %.3e\t%.3e\t%.3e\t",
00436 ots ,
00437 opac.opacity_abs[ip-1],
00438 ots/opac.opacity_abs[ip-1] );
00439 fprintf(ioQQQ,"iteration %li type %i %i %i \n",
00440 iteration,
00441 nOTS_Line_type,
00442 nOTS1,nOTS2 );
00443 }
00444 }
00445 return;
00446 }
00447
00448
00449
00450
00451 STATIC void RT_OTS_AddCont(
00452
00453 realnum ots,
00454
00455 long int ip)
00456 {
00457
00458 DEBUG_ENTRY( "RT_OTS_AddCont()" );
00459
00460
00461
00462
00463
00464
00465
00466 if( ip > rfield.nflux )
00467 {
00468 return;
00469 }
00470
00471 ASSERT( ip > 0 );
00472 ASSERT( ots >= 0. );
00473 ASSERT( ip <= rfield.nupper );
00474
00475
00476
00477
00478 if( opac.opacity_abs[ip-1] > 0. )
00479 {
00480 rfield.otscon[ip-1] += (realnum)(ots/opac.opacity_abs[ip-1]);
00481 }
00482 return;
00483 }
00484
00485
00486
00487
00488 void RT_OTS_Update(double *SumOTS)
00489 {
00490 long int i;
00491
00492 DEBUG_ENTRY( "RT_OTS_Update()" );
00493
00494 *SumOTS = 0.;
00495
00496
00497 if( rfield.lgKillOTSLine )
00498 {
00499 for( i=0; i < rfield.nflux; i++ )
00500 {
00501 rfield.otslin[i] = 0.;
00502 }
00503 }
00504
00505
00506 *SumOTS = 0.;
00507
00508 for( i=0; i < rfield.nflux; ++i )
00509 {
00510 double CurrentInverseOpacity = 1./MAX2( SMALLDOUBLE , opac.opacity_abs[i] );
00511
00512
00513
00514 rfield.ConOTS_local_OTS_rate[i] = (realnum)((double)rfield.ConOTS_local_photons[i]*CurrentInverseOpacity);
00515
00516
00517 *SumOTS += (rfield.otscon[i] + rfield.otslin[i])*opac.opacity_abs[i];
00518
00519 rfield.SummedDif[i] = rfield.otscon[i] + rfield.otslin[i] + rfield.outlin_noplot[i]+
00520 rfield.ConInterOut[i]*rfield.lgOutOnly + rfield.outlin[0][i] +
00521 rfield.ConOTS_local_OTS_rate[i];
00522
00523 rfield.SummedCon[i] = rfield.flux[0][i] + rfield.SummedDif[i];
00524 rfield.SummedOcc[i] = rfield.SummedCon[i]*rfield.convoc[i];
00525 }
00526
00527
00528
00529 rfield.flux_accum[rfield.nflux-1] = 0.;
00530 for( i=1; i < rfield.nflux; i++ )
00531 {
00532 rfield.flux_accum[rfield.nflux-i-1] = rfield.flux_accum[rfield.nflux-i] +
00533 rfield.SummedCon[rfield.nflux-i-1];
00534 }
00535
00536
00537
00538 ASSERT( rfield.ipPlasma > 0 );
00539
00540
00541 for( i=0; i < rfield.ipPlasma-1; i++ )
00542 {
00543 rfield.otscon[i] = 0.;
00544 rfield.ConOTS_local_OTS_rate[i] = 0.;
00545 rfield.ConOTS_local_photons[i] = 0.;
00546 rfield.otslin[i] = 0.;
00547 rfield.SummedDif[i] = 0.;
00548 rfield.OccNumbBremsCont[i] = 0.;
00549 rfield.SummedCon[i] = 0.;
00550 rfield.SummedOcc[i] = 0.;
00551 rfield.ConInterOut[i] = 0.;
00552 }
00553
00554
00555 if( rfield.ipEnergyBremsThin > 0 )
00556 {
00557 for( i=rfield.ipPlasma-1; i < rfield.nflux; i++ )
00558 {
00559
00560
00561
00562
00563 realnum factor = MIN2(1.f,rfield.anu2[MAX2(0,rfield.ipEnergyBremsThin-1)] / rfield.anu2[i]);
00564
00565 fixit();
00566
00567 rfield.OccNumbBremsCont[i] = (realnum)(1./(1./SDIV(rfield.ContBoltz[i]) - 1.)) * factor;
00568 }
00569 }
00570 return;
00571 }
00572
00573
00574
00575
00576
00577 void RT_OTS_Zero( void )
00578 {
00579 long int i;
00580
00581 DEBUG_ENTRY( "RT_OTS_Zero()" );
00582
00583
00584
00585 for( i=0; i <= rfield.nflux; i++ )
00586 {
00587 rfield.SummedDif[i] = 0.;
00588
00589 rfield.otscon[i] = 0.;
00590 rfield.otslin[i] = 0.;
00591
00592 rfield.ConInterOut[i] = 0.;
00593 rfield.outlin[0][i] = 0.;
00594 rfield.outlin_noplot[i] = 0.;
00595 rfield.SummedDif[i] = 0.;
00596
00597 rfield.SummedCon[i] = rfield.flux[0][i];
00598 rfield.SummedOcc[i] = rfield.SummedCon[i]*rfield.convoc[i];
00599 rfield.ConOTS_local_photons[i] = 0.;
00600 rfield.ConOTS_local_OTS_rate[i] = 0.;
00601 }
00602 rfield.resetCoarseTransCoef();
00603 return;
00604 }
00605
00606
00607
00608
00609 void RT_OTS_ChkSum(long int ipPnt)
00610 {
00611 static long int nInsane=0;
00612 long int i;
00613 double phisig;
00614 const int LIM_INSAME_PRT = 30;
00615
00616 DEBUG_ENTRY( "RT_OTS_ChkSum()" );
00617
00618
00619
00620
00621 for( i=rfield.ipEnergyBremsThin; i < rfield.nflux; i++ )
00622 {
00623 phisig = rfield.otscon[i] + rfield.otslin[i] + rfield.ConInterOut[i]*rfield.lgOutOnly +
00624 rfield.outlin[0][i]+
00625 rfield.outlin_noplot[i]+
00626 rfield.ConOTS_local_OTS_rate[i];
00627
00628
00629 if( phisig > 0. && rfield.SummedDif[i]> 0.)
00630 {
00631 if( fabs(rfield.SummedDif[i]/phisig-1.) > 1e-3 )
00632 {
00633 ++nInsane;
00634
00635
00636 if( nInsane < LIM_INSAME_PRT )
00637 {
00638 fprintf( ioQQQ, " PROBLEM RT_OTS_ChkSum insane SummedDif at energy %.5e error= %.2e i=%4ld\n",
00639 rfield.anu[i], rfield.SummedDif[i]/phisig - 1., i );
00640 fprintf( ioQQQ, " SummedDif, sum are%11.4e%11.4e\n",
00641 rfield.SummedDif[i], phisig );
00642 fprintf( ioQQQ, " otscon otslin ConInterOut outlin are%11.4e%11.4e%11.4e%11.4e\n",
00643 rfield.otscon[i], rfield.otslin[i]+rfield.outlin_noplot[i], rfield.ConInterOut[i],
00644 rfield.outlin[0][i]+rfield.outlin_noplot[i] );
00645 fprintf( ioQQQ, " line continuum here are %4.4s %4.4s\n",
00646 rfield.chLineLabel[i], rfield.chContLabel[i] );
00647 }
00648 }
00649 }
00650
00651 phisig += rfield.flux[0][i];
00652
00653
00654 if( phisig > 0. && rfield.SummedDif[i]> 0. )
00655 {
00656 if( fabs(rfield.SummedCon[i]/phisig-1.) > 1e-3 )
00657 {
00658 ++nInsane;
00659
00660
00661 if( nInsane < LIM_INSAME_PRT )
00662 {
00663 fprintf( ioQQQ, " PROBLEM RT_OTS_ChkSum %3ld, insane SummedCon at energy %.5e error=%.2e i=%ld\n",
00664 ipPnt, rfield.anu[i], rfield.SummedCon[i]/phisig - 1., i );
00665 fprintf( ioQQQ, " SummedCon, sum are %.4e %.4e\n",
00666 rfield.SummedCon[i], phisig );
00667 fprintf( ioQQQ, " otscon otslin ConInterOut outlin flux are%.4e %.4e %.4e %.4e %.4e\n",
00668 rfield.otscon[i], rfield.otslin[i]+rfield.outlin_noplot[i], rfield.ConInterOut[i],
00669 rfield.outlin[0][i]+rfield.outlin_noplot[i], rfield.flux[0][i] );
00670 fprintf( ioQQQ, " line continuum here are %s %s\n",
00671 rfield.chLineLabel[i], rfield.chContLabel[i]
00672 );
00673 }
00674 }
00675 }
00676 }
00677
00678 if( nInsane > 0 )
00679 {
00680 fprintf( ioQQQ, " PROBLEM RT_OTS_ChkSum too much insanity to continue.\n");
00681
00682 TotalInsanity();
00683 }
00684 return;
00685 }
00686
00687
00688
00689
00690 void RT_OTS_PrtRate(
00691
00692 double weak ,
00693
00694 int chFlag )
00695 {
00696 long int i;
00697
00698 DEBUG_ENTRY( "RT_OTS_PrtRate()" );
00699
00700
00701 ASSERT( chFlag=='l' || chFlag=='c' || chFlag=='b' );
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 if( chFlag == 'c' || chFlag == 'b' )
00716 {
00717 fprintf( ioQQQ, " DEBUG OTSCON array, anu, otscon, opac, OTS*opac limit:%.2e zone:%.2f IonConv?%c\n",
00718 weak,fnzone ,TorF(conv.lgConvIoniz()) );
00719
00720 for( i=0; i < rfield.nupper; i++ )
00721 {
00722 if( rfield.otscon[i]*opac.opacity_abs[i] > weak )
00723 {
00724 fprintf( ioQQQ, " %4ld%12.4e%12.4e%12.4e%12.4e %s \n",
00725 i,
00726 rfield.anu[i],
00727 rfield.otscon[i],
00728 opac.opacity_abs[i],
00729 rfield.otscon[i]*opac.opacity_abs[i],
00730 rfield.chContLabel[i]);
00731
00732 }
00733 }
00734 }
00735
00736
00737
00738
00739 if( chFlag == 'l' || chFlag == 'b' )
00740 {
00741 fprintf( ioQQQ, "DEBUG density He %.2e He+2 %.2e O+2 %.2e\n",
00742 dense.gas_phase[ipHELIUM] , dense.xIonDense[ipHELIUM][2],
00743 dense.xIonDense[ipOXYGEN][2] );
00744 fprintf( ioQQQ, " DEBUG OTSLIN array, anu, otslin, opac, OTS*opac Lab nLine limit:%.2e zone:%.2f IonConv?%c\n",
00745 weak,fnzone,TorF(conv.lgConvIoniz()) );
00746
00747 for( i=0; i < rfield.nupper; i++ )
00748 {
00749 if( rfield.otslin[i]*opac.opacity_abs[i] > weak )
00750 {
00751 fprintf( ioQQQ, " %4ld%12.4e%12.4e%12.4e%12.4e %s %3li\n",
00752 i,
00753 rfield.anu[i],
00754 rfield.otslin[i],
00755 opac.opacity_abs[i],
00756 rfield.otslin[i]*opac.opacity_abs[i],
00757 rfield.chLineLabel[i] ,
00758 rfield.line_count[i] );
00759 }
00760 }
00761 }
00762 return;
00763 }