00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "physconst.h"
00007 #include "iso.h"
00008 #include "geometry.h"
00009 #include "dense.h"
00010 #include "prt.h"
00011 #include "opacity.h"
00012 #include "coolheavy.h"
00013 #include "phycon.h"
00014 #include "rfield.h"
00015 #include "predcont.h"
00016 #include "lines_service.h"
00017 #include "radius.h"
00018 #include "continuum.h"
00019 #include "lines.h"
00020
00021 void lines_continuum(void)
00022 {
00023
00024 double f1,
00025 f2 ,
00026 bac ,
00027 flow;
00028 long i,nBand;
00029
00030 DEBUG_ENTRY( "lines_continuum()" );
00031
00032
00033
00034 const bool KILL_CONT = false;
00035
00036 i = StuffComment( "continua" );
00037 linadd( 0., (realnum)i , "####", 'i',
00038 " start continua");
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00051
00052
00053
00054
00055
00056
00057
00058
00059 f1 = (rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1] +
00060 rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1]/radius.r1r0sq )/
00061 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1];
00062
00063
00064
00065 f2 = (rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]+
00066 rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]/radius.r1r0sq )/
00067 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2];
00068
00069
00070 f1 = f1*0.250*0.250*EN1RYD*radius.r1r0sq;
00071 f2 = f2*0.250*0.250*EN1RYD*radius.r1r0sq;
00072 bac = (f1 - f2);
00073
00074
00075
00076
00077
00078
00079 if( LineSave.ipass > 0 )
00080 {
00081 LineSv[LineSave.nsum].sumlin[0] = 0.;
00082 LineSv[LineSave.nsum].sumlin[1] = 0.;
00083 }
00084
00085 linadd(MAX2(0.,bac)/radius.dVeff,3646,"Bac ",'i',
00086 "residual flux at head of Balmer continuum, nuFnu ");
00087
00088
00089
00090
00091 if( KILL_CONT && LineSave.ipass > 0 )
00092 {
00093 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00094 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00095 }
00096
00097
00098 if( LineSave.ipass > 0 )
00099 {
00100 LineSv[LineSave.nsum].sumlin[0] = 0.;
00101 LineSv[LineSave.nsum].sumlin[1] = 0.;
00102 }
00103
00104 linadd(f1/radius.dVeff,3645,"nFnu",'i',
00105 "total flux above head of Balmer continuum, nuFnu ");
00106
00107
00108
00109
00110 if( KILL_CONT && LineSave.ipass > 0 )
00111 {
00112 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00113 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00114 }
00115
00116
00117 if( LineSave.ipass > 0 )
00118 {
00119 LineSv[LineSave.nsum].sumlin[0] = 0.;
00120 LineSv[LineSave.nsum].sumlin[1] = 0.;
00121 }
00122
00123 linadd(f2/radius.dVeff,3647,"nFnu",'i',
00124 "total flux above head of Balmer continuum, nuFnu ");
00125
00126
00127
00128
00129 if( KILL_CONT && LineSave.ipass > 0 )
00130 {
00131 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00132 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00133 }
00134
00135
00136
00137
00138
00139
00140
00141 f1 = rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1]/
00142 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1];
00143
00144
00145 f2 = rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]/
00146 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2];
00147
00148
00149 bac = (f1 - f2)*0.250*0.250*EN1RYD*radius.r1r0sq;
00150
00151
00152 if( LineSave.ipass > 0 )
00153 {
00154 LineSv[LineSave.nsum].sumlin[0] = 0.;
00155 LineSv[LineSave.nsum].sumlin[1] = 0.;
00156 }
00157
00158 linadd(MAX2(0.,bac)/radius.dVeff,3646,"cout",'i',
00159 "residual flux in Balmer continuum, nuFnu ");
00160
00161
00162
00163
00164 if( KILL_CONT && LineSave.ipass > 0 )
00165 {
00166 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00167 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00168 }
00169
00170
00171
00172
00173
00174
00175
00176 f1 = rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1]/
00177 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1];
00178
00179 f2 = rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]/
00180 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2];
00181
00182
00183 bac = (f1 - f2)*0.250*0.250*EN1RYD;
00184
00185
00186 if( LineSave.ipass > 0 )
00187 {
00188 LineSv[LineSave.nsum].sumlin[0] = 0.;
00189 LineSv[LineSave.nsum].sumlin[1] = 0.;
00190 }
00191
00192 linadd(MAX2(0.,bac)/radius.dVeff,3646,"cref",'i',
00193 "residual flux in Balmer continuum, nuFnu ");
00194
00195
00196
00197
00198 if( KILL_CONT && LineSave.ipass > 0 )
00199 {
00200 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00201 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00202 }
00203
00204
00205
00206 if( nzone > 0 )
00207 {
00208
00209 f1 = rfield.ConEmitLocal[nzone][iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1]/
00210 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1];
00211 f2 = rfield.ConEmitLocal[nzone][iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]/
00212 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2];
00213 bac = (f1 - f2)*0.250*0.250*EN1RYD;
00214 }
00215 else
00216 {
00217 f1 = 0.;
00218 f2 = 0.;
00219 bac = 0.;
00220 }
00221
00222 linadd(MAX2(0.,bac),3646,"thin",'i',
00223 "residual flux in Balmer continuum, nuFnu ");
00224
00225 continuum.cn4861 /= (realnum)radius.dVeff;
00226 linadd(continuum.cn4861,4860,"Inci",'i',
00227 "incident continuum nu*f_nu at H-beta, at illuminated face of cloud ");
00228
00229
00230
00231
00232
00233
00234
00235 if( LineSave.ipass > 0 )
00236 {
00237 LineSv[LineSave.nsum-1].sumlin[1] = LineSv[LineSave.nsum-1].sumlin[0];
00238 }
00239
00240 continuum.cn1216 /= (realnum)radius.dVeff;
00241 linadd(continuum.cn1216,1215,"Inci",'i',
00242 "incident continuum nu*f_nu near Ly-alpha, at illuminated face of cloud");
00243
00244 if( LineSave.ipass > 0 )
00245 {
00246 LineSv[LineSave.nsum-1].sumlin[1] = LineSv[LineSave.nsum-1].sumlin[0];
00247 }
00248
00249 continuum.cn1216 *= (realnum)radius.dVeff;
00250 continuum.cn4861 *= (realnum)radius.dVeff;
00251
00252 if( LineSave.ipass > 0 )
00253 {
00254 continuum.cn4861 = 0.;
00255 continuum.cn1216 = 0.;
00256 }
00257
00258 flow = (iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2p][ipRecRad] +
00259 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2s][ipRecRad])*
00260 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2p][ipRecEsc]*
00261 dense.eden*dense.xIonDense[ipHYDROGEN][1]* 5.45e-12;
00262 linadd(flow,0,"Ba C",'i',
00263 "integrated Balmer continuum emission");
00264
00265 if( iso.n_HighestResolved_max[ipH_LIKE][ipHYDROGEN] >= 3 )
00266 {
00267 flow = ( iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3s][ipRecRad]*
00268 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3s][ipRecEsc] +
00269 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3p][ipRecRad]*
00270 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3p][ipRecEsc] +
00271 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3d][ipRecRad]*
00272 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH3d][ipRecEsc] ) *
00273 dense.eden*dense.xIonDense[ipHYDROGEN][1]*3.53e-12;
00274 }
00275 else
00276 {
00277 flow = iso.RadRecomb[ipH_LIKE][ipHYDROGEN][3][ipRecRad]*
00278 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][3][ipRecEsc]*
00279 dense.eden*dense.xIonDense[ipHYDROGEN][1]*3.53e-12;
00280 }
00281 linadd(flow,0,"PA C",'i',
00282 "Paschen continuum emission ");
00283
00284
00285
00286
00287
00288 for( nBand=0; nBand<continuum.nContBand; ++nBand )
00289 {
00290 double total = 0.;
00291
00292 for( i=continuum.ipContBandLow[nBand]; i<continuum.ipContBandHi[nBand]; ++i )
00293 {
00294 double xIntenOut =
00295
00296 rfield.flux[i-1] +
00297
00298
00299
00300 (rfield.ConEmitOut[i-1] +
00301
00302
00303 rfield.outlin[i-1])*geometry.covgeo;
00304
00305
00306
00307 double xIntenIn =
00308 ((double)rfield.ConEmitReflec[i-1]/SDIV((double)opac.E2TauAbsFace[i-1]) +
00309
00310 rfield.reflin[i-1] )*geometry.covgeo;
00311
00312
00313 total += rfield.anu[i-1] *
00314 emergent_line( xIntenIn , xIntenOut , i )
00315
00316 / SDIV(opac.tmn[i-1]);
00317 }
00318
00319
00320
00321
00322 double corr = emergent_line( 0.5 , 0.5 ,
00323 (continuum.ipContBandLow[nBand]+continuum.ipContBandHi[nBand])/2 );
00324 if( corr < SMALLFLOAT )
00325 total = 0.;
00326 else
00327 total /= corr;
00328
00329
00330 total *= EN1RYD*radius.r1r0sq/radius.dVeff;
00331
00332 if( LineSave.ipass > 0 )
00333 {
00334 LineSv[LineSave.nsum].sumlin[0] = 0.;
00335 LineSv[LineSave.nsum].sumlin[1] = 0.;
00336 }
00337
00338 lindst( total ,
00339 continuum.ContBandWavelength[nBand] ,
00340 continuum.chContBandLabels[nBand],
00341 (continuum.ipContBandLow[nBand]+continuum.ipContBandHi[nBand])/2 ,
00342 'i' , false,
00343 "continuum bands defined in bands_continuum.dat");
00344 }
00345
00346 linadd(MAX2(0.,CoolHeavy.brems_cool_net),0,"HFFc",'c',
00347 "net free-free cooling, ALL species, free-free heating subtracted, so nearly cancels with cooling in LTE ");
00348
00349 linadd(MAX2(0.,-CoolHeavy.brems_cool_net),0,"HFFh",'h',
00350 "net free-free heating, nearly cancels with cooling in LTE ");
00351
00352 linadd(CoolHeavy.brems_cool_h,0,"H FF",'i',
00353 " H brems (free-free) cooling ");
00354
00355 linadd(CoolHeavy.brems_heat_total,0,"FF H",'i',
00356 "total free-free heating ");
00357
00358 linadd(CoolHeavy.brems_cool_he,0,"HeFF",'i',
00359 "He brems emission ");
00360
00361 linadd(CoolHeavy.herec,0,"HeFB",'c',
00362 "He recombination cooling ");
00363
00364 linadd(CoolHeavy.heavfb,0,"MeFB",'c',
00365 "heavy element recombination cooling ");
00366
00367 linadd(CoolHeavy.brems_cool_metals,0,"MeFF",'i',
00368 "heavy elements (metals) brems cooling, heat not subtracted ");
00369
00370 linadd(CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he+CoolHeavy.brems_cool_metals,0,"ToFF",'i',
00371 "total brems emission - total cooling but not minus heating ");
00372
00373 linadd((CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he)*sexp(5.8e6/phycon.te),0,"FF X",'i',
00374 "part of H brems, in x-ray beyond 0.5KeV ");
00375
00376 linadd(CoolHeavy.eebrm,0,"eeff",'c',
00377 "electron - electron brems ");
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398 for( i=0; i < NPREDCONT; i++ )
00399 {
00400 double SourceTransmitted , Cont_nInu;
00401 double SourceReflected,
00402 DiffuseOutward,
00403 DiffuseInward;
00404 double renorm;
00405
00406
00407
00408 TauDummy.WLAng = (realnum)(RYDLAM/EnrPredCont[i]);
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419 renorm = rfield.anu2[ipPredCont[i]]*EN1RYD/rfield.widflx[ipPredCont[i]];
00420
00421
00422 if( prt.lgDiffuseInward )
00423 {
00424 DiffuseInward = rfield.ConEmitReflec[ipPredCont[i]]*renorm;
00425
00426 }
00427 else
00428 {
00429 DiffuseInward = 0.;
00430 }
00431
00432
00433 if( prt.lgDiffuseOutward )
00434 {
00435 DiffuseOutward = rfield.ConEmitOut[ipPredCont[i]]*renorm*radius.r1r0sq;
00436 }
00437 else
00438 {
00439 DiffuseOutward = 0.;
00440 }
00441
00442
00443 if( prt.lgSourceReflected )
00444 {
00445 SourceReflected = rfield.ConRefIncid[ipPredCont[i]]*renorm;
00446
00447 }
00448 else
00449 {
00450 SourceReflected = 0.;
00451 }
00452
00453
00454 if( prt.lgSourceTransmitted )
00455 {
00456 SourceTransmitted = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq;
00457 }
00458 else
00459 {
00460 SourceTransmitted = 0.;
00461 }
00462
00463
00464
00465 if( LineSave.ipass > 0 )
00466 {
00467 LineSv[LineSave.nsum].sumlin[0] = 0.;
00468 LineSv[LineSave.nsum].sumlin[1] = 0.;
00469 }
00470
00471 linadd((DiffuseInward+SourceReflected+DiffuseOutward+SourceTransmitted)/radius.dVeff,
00472 TauDummy.WLAng,"nFnu",'i',
00473 "total continuum at selected energy points " );
00474
00475
00476
00477
00478 if( KILL_CONT && LineSave.ipass > 0 )
00479 {
00480 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00481 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00482 }
00483
00484
00485 if( LineSave.ipass > 0 )
00486 {
00487 LineSv[LineSave.nsum].sumlin[0] = 0.;
00488 LineSv[LineSave.nsum].sumlin[1] = 0.;
00489 }
00490
00491
00492
00493 Cont_nInu = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq +
00494 rfield.ConRefIncid[ipPredCont[i]]*renorm;
00495
00496 # if 0
00497
00498 if( !i )
00499 fprintf(ioQQQ,"\n");
00500 char chWL[1000];
00501 sprt_wl( chWL , TauDummy.WLAng );
00502 fprintf( ioQQQ,"assert line luminosity \"nInu\" %s %.3f\n",
00503 chWL ,
00504 log10(SDIV(Cont_nInu/radius.dVeff)) + radius.Conv2PrtInten );
00505 # endif
00506
00507 linadd( Cont_nInu/radius.dVeff,TauDummy.WLAng,"nInu",'i',
00508 "transmitted and reflected incident continuum at selected energy points " );
00509
00510
00511
00512 if( KILL_CONT && LineSave.ipass > 0 )
00513 {
00514 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00515 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00516 }
00517
00518
00519 if( LineSave.ipass > 0 )
00520 {
00521 LineSv[LineSave.nsum].sumlin[0] = 0.;
00522 LineSv[LineSave.nsum].sumlin[1] = 0.;
00523 }
00524
00525 linadd( (DiffuseInward+SourceReflected)/radius.dVeff,TauDummy.WLAng,"InwT",'i',
00526 "total reflected continuum, total inward emission plus reflected (XXdiffuseXX) total continuum ");
00527
00528 if( KILL_CONT && LineSave.ipass > 0 )
00529 {
00530 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00531 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00532 }
00533
00534
00535 if( LineSave.ipass > 0 )
00536 {
00537 LineSv[LineSave.nsum].sumlin[0] = 0.;
00538 LineSv[LineSave.nsum].sumlin[1] = 0.;
00539 }
00540
00541 linadd(SourceReflected/radius.dVeff,TauDummy.WLAng,"InwC",'i',
00542 "reflected incident continuum (only incident) ");
00543
00544 if( KILL_CONT && LineSave.ipass > 0 )
00545 {
00546 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00547 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00548 }
00549 }
00550 return;
00551 }