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
00340
00341
00342
00343
00344
00345 -continuum.ContBandWavelength[nBand] ,
00346 continuum.chContBandLabels[nBand],
00347 (continuum.ipContBandLow[nBand]+continuum.ipContBandHi[nBand])/2 ,
00348 'i' , false,
00349 "continuum bands defined in bands_continuum.dat");
00350 }
00351
00352 linadd(MAX2(0.,CoolHeavy.brems_cool_net),0,"HFFc",'c',
00353 "net free-free cooling, ALL species, free-free heating subtracted, so nearly cancels with cooling in LTE ");
00354
00355 linadd(MAX2(0.,-CoolHeavy.brems_cool_net),0,"HFFh",'h',
00356 "net free-free heating, nearly cancels with cooling in LTE ");
00357
00358 linadd(CoolHeavy.brems_cool_h,0,"H FF",'i',
00359 " H brems (free-free) cooling ");
00360
00361 linadd(CoolHeavy.brems_heat_total,0,"FF H",'i',
00362 "total free-free heating ");
00363
00364 linadd(CoolHeavy.brems_cool_he,0,"HeFF",'i',
00365 "He brems emission ");
00366
00367 linadd(CoolHeavy.herec,0,"HeFB",'c',
00368 "He recombination cooling ");
00369
00370 linadd(CoolHeavy.heavfb,0,"MeFB",'c',
00371 "heavy element recombination cooling ");
00372
00373 linadd(CoolHeavy.brems_cool_metals,0,"MeFF",'i',
00374 "heavy elements (metals) brems cooling, heat not subtracted ");
00375
00376 linadd(CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he+CoolHeavy.brems_cool_metals,0,"ToFF",'i',
00377 "total brems emission - total cooling but not minus heating ");
00378
00379 linadd((CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he)*sexp(5.8e6/phycon.te),0,"FF X",'i',
00380 "part of H brems, in x-ray beyond 0.5KeV ");
00381
00382 linadd(CoolHeavy.eebrm,0,"eeff",'c',
00383 "electron - electron brems ");
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 for( i=0; i < NPREDCONT; i++ )
00405 {
00406 double SourceTransmitted , Cont_nInu;
00407 double SourceReflected,
00408 DiffuseOutward,
00409 DiffuseInward;
00410 double renorm;
00411
00412
00413
00414 TauDummy.WLAng = (realnum)(RYDLAM/EnrPredCont[i]);
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425 renorm = rfield.anu2[ipPredCont[i]]*EN1RYD/rfield.widflx[ipPredCont[i]];
00426
00427
00428 if( prt.lgDiffuseInward )
00429 {
00430 DiffuseInward = rfield.ConEmitReflec[ipPredCont[i]]*renorm;
00431
00432 }
00433 else
00434 {
00435 DiffuseInward = 0.;
00436 }
00437
00438
00439 if( prt.lgDiffuseOutward )
00440 {
00441 DiffuseOutward = rfield.ConEmitOut[ipPredCont[i]]*renorm*radius.r1r0sq;
00442 }
00443 else
00444 {
00445 DiffuseOutward = 0.;
00446 }
00447
00448
00449 if( prt.lgSourceReflected )
00450 {
00451 SourceReflected = rfield.ConRefIncid[ipPredCont[i]]*renorm;
00452
00453 }
00454 else
00455 {
00456 SourceReflected = 0.;
00457 }
00458
00459
00460 if( prt.lgSourceTransmitted )
00461 {
00462 SourceTransmitted = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq;
00463 }
00464 else
00465 {
00466 SourceTransmitted = 0.;
00467 }
00468
00469
00470
00471 if( LineSave.ipass > 0 )
00472 {
00473 LineSv[LineSave.nsum].sumlin[0] = 0.;
00474 LineSv[LineSave.nsum].sumlin[1] = 0.;
00475 }
00476
00477 linadd((DiffuseInward+SourceReflected+DiffuseOutward+SourceTransmitted)/radius.dVeff,
00478 TauDummy.WLAng,"nFnu",'i',
00479 "total continuum at selected energy points " );
00480
00481
00482
00483
00484 if( KILL_CONT && LineSave.ipass > 0 )
00485 {
00486 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00487 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00488 }
00489
00490
00491 if( LineSave.ipass > 0 )
00492 {
00493 LineSv[LineSave.nsum].sumlin[0] = 0.;
00494 LineSv[LineSave.nsum].sumlin[1] = 0.;
00495 }
00496
00497
00498
00499 Cont_nInu = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq +
00500 rfield.ConRefIncid[ipPredCont[i]]*renorm;
00501
00502 # if 0
00503
00504 if( !i )
00505 fprintf(ioQQQ,"\n");
00506 char chWL[1000];
00507 sprt_wl( chWL , TauDummy.WLAng );
00508 fprintf( ioQQQ,"assert line luminosity \"nInu\" %s %.3f\n",
00509 chWL ,
00510 log10(SDIV(Cont_nInu/radius.dVeff)) + radius.Conv2PrtInten );
00511 # endif
00512
00513 linadd( Cont_nInu/radius.dVeff,TauDummy.WLAng,"nInu",'i',
00514 "transmitted and reflected incident continuum at selected energy points " );
00515
00516
00517
00518 if( KILL_CONT && LineSave.ipass > 0 )
00519 {
00520 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00521 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00522 }
00523
00524
00525 if( LineSave.ipass > 0 )
00526 {
00527 LineSv[LineSave.nsum].sumlin[0] = 0.;
00528 LineSv[LineSave.nsum].sumlin[1] = 0.;
00529 }
00530
00531 linadd( (DiffuseInward+SourceReflected)/radius.dVeff,TauDummy.WLAng,"InwT",'i',
00532 "total reflected continuum, total inward emission plus reflected (XXdiffuseXX) total continuum ");
00533
00534 if( KILL_CONT && LineSave.ipass > 0 )
00535 {
00536 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00537 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00538 }
00539
00540
00541 if( LineSave.ipass > 0 )
00542 {
00543 LineSv[LineSave.nsum].sumlin[0] = 0.;
00544 LineSv[LineSave.nsum].sumlin[1] = 0.;
00545 }
00546
00547 linadd(SourceReflected/radius.dVeff,TauDummy.WLAng,"InwC",'i',
00548 "reflected incident continuum (only incident) ");
00549
00550 if( KILL_CONT && LineSave.ipass > 0 )
00551 {
00552 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00553 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00554 }
00555 }
00556 return;
00557 }