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
00037 i = StuffComment( "continua" );
00038 linadd( 0., (float)i , "####", 'i');
00039
00040
00041 if( LineSave.ipass > 0 )
00042 {
00043 LineSv[LineSave.nsum].sumlin[0] = 0.;
00044 LineSv[LineSave.nsum].sumlin[1] = 0.;
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00058
00059
00060
00061
00062
00063
00064
00065
00066 f1 = (rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1] +
00067 rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1]/radius.r1r0sq )/
00068 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-1];
00069
00070
00071
00072 f2 = (rfield.ConEmitOut[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]+
00073 rfield.ConEmitReflec[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2]/radius.r1r0sq )/
00074 rfield.widflx[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][2]-2];
00075
00076
00077 f1 = f1*0.250*0.250*EN1RYD*radius.r1r0sq;
00078 f2 = f2*0.250*0.250*EN1RYD*radius.r1r0sq;
00079 bac = (f1 - f2);
00080
00081
00082 if( LineSave.ipass > 0 )
00083 {
00084 LineSv[LineSave.nsum].sumlin[0] = 0.;
00085 LineSv[LineSave.nsum].sumlin[1] = 0.;
00086 }
00087
00088 linadd(MAX2(0.,bac)/radius.dVeff,3646,"Bac ",'i');
00089
00090
00091
00092
00093 if( KILL_CONT && LineSave.ipass > 0 )
00094 {
00095 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00096 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00097 }
00098
00099
00100 if( LineSave.ipass > 0 )
00101 {
00102 LineSv[LineSave.nsum].sumlin[0] = 0.;
00103 LineSv[LineSave.nsum].sumlin[1] = 0.;
00104 }
00105
00106 linadd(f1/radius.dVeff,3645,"nFnu",'i');
00107
00108
00109
00110
00111 if( KILL_CONT && LineSave.ipass > 0 )
00112 {
00113 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00114 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00115 }
00116
00117
00118 if( LineSave.ipass > 0 )
00119 {
00120 LineSv[LineSave.nsum].sumlin[0] = 0.;
00121 LineSv[LineSave.nsum].sumlin[1] = 0.;
00122 }
00123
00124 linadd(f2/radius.dVeff,3647,"nFnu",'i');
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
00159 linadd(MAX2(0.,bac)/radius.dVeff,3646,"cout",'i');
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
00193 linadd(MAX2(0.,bac)/radius.dVeff,3646,"cref",'i');
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
00223 linadd(MAX2(0.,bac),3646,"thin",'i');
00224
00225
00226 continuum.cn4861 /= (float)radius.dVeff;
00227 linadd(continuum.cn4861,4860,"Inci",'i');
00228
00229
00230
00231
00232
00233
00234 if( LineSave.ipass > 0 )
00235 {
00236 LineSv[LineSave.nsum-1].sumlin[1] = LineSv[LineSave.nsum-1].sumlin[0];
00237 }
00238
00239
00240 continuum.cn1216 /= (float)radius.dVeff;
00241 linadd(continuum.cn1216,1215,"Inci",'i');
00242
00243 if( LineSave.ipass > 0 )
00244 {
00245 LineSv[LineSave.nsum-1].sumlin[1] = LineSv[LineSave.nsum-1].sumlin[0];
00246 }
00247
00248 continuum.cn1216 *= (float)radius.dVeff;
00249 continuum.cn4861 *= (float)radius.dVeff;
00250
00251 if( LineSave.ipass > 0 )
00252 {
00253 continuum.cn4861 = 0.;
00254 continuum.cn1216 = 0.;
00255 }
00256
00257
00258 flow = (iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2p][ipRecRad] + iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2s][ipRecRad])*
00259 iso.RadRecomb[ipH_LIKE][ipHYDROGEN][ipH2p][ipRecEsc]*dense.eden*dense.xIonDense[ipHYDROGEN][1]*
00260 5.45e-12;
00261 linadd(flow,0,"Ba C",'i');
00262
00263
00264
00265 flow = iso.RadRecomb[ipH_LIKE][ipHYDROGEN][3][ipRecRad]*iso.RadRecomb[ipH_LIKE][ipHYDROGEN][3][ipRecEsc]*
00266 dense.eden*dense.xIonDense[ipHYDROGEN][1]*3.53e-12;
00267 linadd(flow,0,"PA C",'i');
00268
00269
00270
00271
00272
00273 for( nBand=0; nBand<continuum.nContBand; ++nBand )
00274 {
00275 double total = 0.;
00276
00277 for( i=continuum.ipContBandLow[nBand]; i<continuum.ipContBandHi[nBand]; ++i )
00278 {
00279 double xIntenOut =
00280
00281 rfield.flux[i-1] +
00282
00283
00284
00285 (rfield.ConEmitOut[i-1] +
00286
00287
00288 rfield.outlin[i-1])*geometry.covgeo;
00289
00290
00291
00292 double xIntenIn =
00293 ((double)rfield.ConEmitReflec[i-1]/SDIV((double)opac.E2TauAbsFace[i-1]) +
00294
00295 rfield.reflin[i-1] )*geometry.covgeo;
00296
00297
00298 total += rfield.anu[i-1] *
00299 emergent_line( xIntenIn , xIntenOut , i )
00300
00301 / SDIV(opac.tmn[i-1]);
00302 }
00303
00304
00305
00306
00307 double corr = emergent_line( 0.5 , 0.5 ,
00308 (continuum.ipContBandLow[nBand]+continuum.ipContBandHi[nBand])/2 );
00309 if( corr < SMALLFLOAT )
00310 total = 0.;
00311 else
00312 total /= corr;
00313
00314
00315 total *= EN1RYD*radius.r1r0sq/radius.dVeff;
00316
00317 if( LineSave.ipass > 0 )
00318 {
00319 LineSv[LineSave.nsum].sumlin[0] = 0.;
00320 LineSv[LineSave.nsum].sumlin[1] = 0.;
00321 }
00322
00323 lindst( total ,
00324 continuum.ContBandWavelength[nBand] ,
00325 continuum.chContBandLabels[nBand],
00326 (continuum.ipContBandLow[nBand]+continuum.ipContBandHi[nBand])/2 ,
00327 'i' , false);
00328 }
00329
00330
00331
00332 linadd(MAX2(0.,CoolHeavy.brems_cool_net),0,"HFFc",'c');
00333
00334
00335 linadd(MAX2(0.,-CoolHeavy.brems_cool_net),0,"HFFh",'h');
00336
00337
00338 linadd(CoolHeavy.brems_cool_h,0,"H FF",'i');
00339
00340
00341 linadd(CoolHeavy.brems_heat_total,0,"FF H",'i');
00342
00343
00344 linadd(CoolHeavy.brems_cool_he,0,"HeFF",'i');
00345
00346
00347 linadd(CoolHeavy.herec,0,"HeFB",'c');
00348
00349
00350 linadd(CoolHeavy.heavfb,0,"MeFB",'c');
00351
00352
00353 linadd(CoolHeavy.brems_cool_metals,0,"MeFF",'i');
00354
00355
00356 linadd(CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he+CoolHeavy.brems_cool_metals,0,"ToFF",'i');
00357
00358
00359 linadd((CoolHeavy.brems_cool_h+CoolHeavy.brems_cool_he)*sexp(5.8e6/phycon.te),0,"FF X"
00360 ,'i');
00361
00362
00363 linadd(CoolHeavy.eebrm,0,"eeff",'c');
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384 for( i=0; i < NPREDCONT; i++ )
00385 {
00386 double SourceTransmitted , Cont_nInu;
00387 double SourceReflected,
00388 DiffuseOutward,
00389 DiffuseInward;
00390 double renorm;
00391
00392
00393
00394 TauDummy.WLAng = (float)(RYDLAM/EnrPredCont[i]);
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405 renorm = rfield.anu2[ipPredCont[i]]*EN1RYD/rfield.widflx[ipPredCont[i]];
00406
00407
00408 if( prt.lgDiffuseInward )
00409 {
00410 DiffuseInward = rfield.ConEmitReflec[ipPredCont[i]]*renorm;
00411
00412 }
00413 else
00414 {
00415 DiffuseInward = 0.;
00416 }
00417
00418
00419 if( prt.lgDiffuseOutward )
00420 {
00421 DiffuseOutward = rfield.ConEmitOut[ipPredCont[i]]*renorm*radius.r1r0sq;
00422 }
00423 else
00424 {
00425 DiffuseOutward = 0.;
00426 }
00427
00428
00429 if( prt.lgSourceReflected )
00430 {
00431 SourceReflected = rfield.ConRefIncid[ipPredCont[i]]*renorm;
00432
00433 }
00434 else
00435 {
00436 SourceReflected = 0.;
00437 }
00438
00439
00440 if( prt.lgSourceTransmitted )
00441 {
00442 SourceTransmitted = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq;
00443 }
00444 else
00445 {
00446 SourceTransmitted = 0.;
00447 }
00448
00449
00450
00451 if( LineSave.ipass > 0 )
00452 {
00453 LineSv[LineSave.nsum].sumlin[0] = 0.;
00454 LineSv[LineSave.nsum].sumlin[1] = 0.;
00455 }
00456
00457
00458
00459 linadd((DiffuseInward+SourceReflected+DiffuseOutward+SourceTransmitted)/radius.dVeff,
00460 TauDummy.WLAng,"nFnu",'i' );
00461
00462
00463
00464
00465 if( KILL_CONT && LineSave.ipass > 0 )
00466 {
00467 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00468 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00469 }
00470
00471
00472 if( LineSave.ipass > 0 )
00473 {
00474 LineSv[LineSave.nsum].sumlin[0] = 0.;
00475 LineSv[LineSave.nsum].sumlin[1] = 0.;
00476 }
00477
00478
00479
00480
00481 Cont_nInu = rfield.flux[ipPredCont[i]]*renorm*radius.r1r0sq +
00482 rfield.ConRefIncid[ipPredCont[i]]*renorm;
00483
00484 linadd( Cont_nInu/radius.dVeff,
00485 TauDummy.WLAng,"nInu",'i' );
00486
00487
00488
00489 if( KILL_CONT && LineSave.ipass > 0 )
00490 {
00491 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00492 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00493 }
00494
00495
00496 if( LineSave.ipass > 0 )
00497 {
00498 LineSv[LineSave.nsum].sumlin[0] = 0.;
00499 LineSv[LineSave.nsum].sumlin[1] = 0.;
00500 }
00501
00502
00503
00504
00505 linadd( (DiffuseInward+SourceReflected)/radius.dVeff,TauDummy.WLAng,"InwT",'i');
00506
00507 if( KILL_CONT && LineSave.ipass > 0 )
00508 {
00509 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00510 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00511 }
00512
00513
00514 if( LineSave.ipass > 0 )
00515 {
00516 LineSv[LineSave.nsum].sumlin[0] = 0.;
00517 LineSv[LineSave.nsum].sumlin[1] = 0.;
00518 }
00519
00520
00521 linadd(SourceReflected/radius.dVeff,TauDummy.WLAng,"InwC",'i');
00522
00523 if( KILL_CONT && LineSave.ipass > 0 )
00524 {
00525 LineSv[LineSave.nsum-1].emslin[0] = 0.;
00526 LineSv[LineSave.nsum-1].emslin[1] = 0.;
00527 }
00528 }
00529
00530 DEBUG_EXIT( "LineSet1()" );
00531 return;
00532 }