00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "physconst.h"
00007 #include "iso.h"
00008 #include "hydrogenic.h"
00009 #include "dynamics.h"
00010 #include "rfield.h"
00011 #include "hextra.h"
00012 #include "colden.h"
00013 #include "geometry.h"
00014 #include "opacity.h"
00015 #include "thermal.h"
00016 #include "doppvel.h"
00017 #include "dense.h"
00018 #include "mole.h"
00019 #include "h2.h"
00020 #include "timesc.h"
00021 #include "hmi.h"
00022 #include "lines_service.h"
00023 #include "taulines.h"
00024 #include "trace.h"
00025 #include "wind.h"
00026 #include "phycon.h"
00027 #include "pressure.h"
00028 #include "grainvar.h"
00029 #include "molcol.h"
00030 #include "conv.h"
00031 #include "hyperfine.h"
00032 #include "mean.h"
00033 #include "struc.h"
00034 #include "radius.h"
00035
00036 STATIC void cmshft(void);
00037
00038 #if !defined(NDEBUG)
00039
00040
00041 STATIC void pnegopc(void);
00042 #endif
00043
00044 void radius_increment(void)
00045 {
00046 # if !defined(NDEBUG)
00047 bool lgFlxNeg;
00048 # endif
00049
00050 long int nelem,
00051 i,
00052 j ,
00053 ion,
00054 nzone_minus_1 ,
00055 mol;
00056 double
00057 avWeight,
00058 DilutionHere ,
00059 escatc,
00060 fmol,
00061 opfac,
00062 relec,
00063 rforce,
00064 t;
00065
00066 double ajmass,
00067 Error,
00068 rjeans;
00069
00070 realnum dradfac;
00071
00072 DEBUG_ENTRY( "radius_increment()" );
00073
00074
00075
00076 if( lgAbort )
00077 {
00078 return;
00079 }
00080
00081
00082 # if !defined(NDEBUG)
00083 if( !dynamics.lgAdvection )
00084 {
00085 long int ipISO;
00086 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00087 {
00088 for( nelem=ipISO; nelem<LIMELM; ++nelem )
00089 {
00090
00091
00092 if( dense.lgElmtOn[nelem] &&
00093 dense.xIonDense[nelem][nelem-ipISO]/dense.eden>conv.EdenErrorAllowed / 10. &&
00094 !(iso.chTypeAtomUsed[ipISO][nelem][0]=='L' &&
00095 iso.xIonSimple[ipISO][nelem]<1e-10) )
00096 {
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 # define ERR_CHK 1.001
00108 double err_chk = ERR_CHK;
00109
00110
00111
00112 if( iso.chTypeAtomUsed[ipISO][nelem][0]=='L' )
00113 err_chk *= 10.;
00114
00115 if( StatesElem[ipISO][nelem][0].Pop >
00116 dense.xIonDense[nelem][nelem-ipISO]/(double)SDIV(dense.xIonDense[nelem][nelem+1-ipISO])*err_chk &&
00117
00118 iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15 )
00119 {
00120 fprintf(ioQQQ,
00121 " DISASTER radius_increment finds inconsistent populations, Pop2Ion zn %.2f ipISO %li nelem %li %.4e %.4e solver:%s\n",
00122 fnzone,
00123 ipISO , nelem ,
00124 StatesElem[ipISO][nelem][0].Pop*dense.xIonDense[nelem][nelem+1-ipISO] ,
00125 dense.xIonDense[nelem][nelem-ipISO] ,
00126 iso.chTypeAtomUsed[ipISO][nelem]);
00127 fprintf(ioQQQ," level solver %s found pop_ion_ov_neut of %.5e",
00128 iso.chTypeAtomUsed[ipISO][nelem] ,
00129 iso.pop_ion_ov_neut[ipISO][nelem] );
00130 fprintf(ioQQQ," ion_solver found pop_ion_ov_neut of %.5e\n",
00131 dense.xIonDense[nelem][nelem+1-ipISO]/SDIV( dense.xIonDense[nelem][nelem-ipISO] ) );
00132 fprintf(ioQQQ,
00133 "simple %.3e Test shows Pop2Ion (%.6e) > xIonDense[nelem]/[nelem+1] (%.6e) \n",
00134 iso.xIonSimple[ipISO][nelem],
00135 StatesElem[ipISO][nelem][0].Pop ,
00136 dense.xIonDense[nelem][nelem-ipISO]/(double)SDIV(dense.xIonDense[nelem][nelem+1-ipISO]) );
00137 }
00138
00139
00140
00141
00142
00143 ASSERT( !conv.lgSearch );
00144 ASSERT( StatesElem[ipISO][nelem][0].Pop <=
00145 dense.xIonDense[nelem][nelem-ipISO]/
00146 (double)SDIV(dense.xIonDense[nelem][nelem+1-ipISO])*err_chk ||
00147
00148 iso.pop_ion_ov_neut[ipISO][nelem] < 1e-15);
00149
00150
00151 if( StatesElem[ipISO][nelem][0].Pop*
00152 dense.xIonDense[nelem][nelem+1-ipISO] >
00153 dense.xIonDense[nelem][nelem-ipISO]*err_chk &&
00154
00155 iso.pop_ion_ov_neut[ipISO][nelem] > 1e-15)
00156 {
00157 fprintf(ioQQQ," DISASTER PopLo fnz %.2f ipISO %li nelem %li pop_ion_ov_neut %.2e 2pops %.6e %.6e solver:%s\n",
00158 fnzone,
00159 ipISO , nelem ,
00160 iso.pop_ion_ov_neut[ipISO][nelem] ,
00161 StatesElem[ipISO][nelem][0].Pop*dense.xIonDense[nelem][nelem+1-ipISO],
00162 dense.xIonDense[nelem][nelem-ipISO]*err_chk ,
00163 iso.chTypeAtomUsed[ipISO][nelem]);
00164 }
00165 ASSERT(
00166
00167 (StatesElem[ipISO][nelem][0].Pop*dense.xIonDense[nelem][nelem+1-ipISO]<=
00168 dense.xIonDense[nelem][nelem-ipISO]*err_chk) ||
00169
00170 iso.pop_ion_ov_neut[ipISO][nelem] < 1e-15);
00171 # undef ERR_CHK
00172 }
00173 }
00174 }
00175 }
00176 # endif
00177
00178 if( trace.lgTrace )
00179 {
00180 fprintf( ioQQQ,
00181 " radius_increment called; radius=%10.3e rinner=%10.3e DRAD=%10.3e drNext=%10.3e ROUTER=%10.3e DEPTH=%10.3e\n",
00182 radius.Radius, radius.rinner, radius.drad, radius.drNext,
00183 radius.router[iteration-1], radius.depth );
00184 }
00185
00186
00187 Error = fabs(dense.eden - dense.EdenTrue)/SDIV(dense.EdenTrue);
00188 if( Error > conv.BigEdenError )
00189 {
00190 conv.BigEdenError = (realnum)Error;
00191 dense.nzEdenBad = nzone;
00192 }
00193 conv.AverEdenError += (realnum)Error;
00194
00195
00196 Error = fabs(thermal.ctot - thermal.htot) / thermal.ctot;
00197 conv.BigHeatCoolError = MAX2((realnum)Error , conv.BigHeatCoolError );
00198 conv.AverHeatCoolError += (realnum)Error;
00199
00200
00201 Error = fabs(pressure.PresTotlCurr - pressure.PresTotlCorrect) / pressure.PresTotlCorrect;
00202 conv.BigPressError = MAX2((realnum)Error , conv.BigPressError );
00203 conv.AverPressError += (realnum)Error;
00204
00205
00206 dense.xMassTotal += dense.xMassDensity * (realnum)(radius.drad_x_fillfac*radius.r1r0sq);
00207
00208
00209 timesc.time_therm_long = MAX2(timesc.time_therm_long,1.5*dense.pden*BOLTZMANN*phycon.te/
00210 thermal.ctot);
00211
00212
00213
00214 ASSERT( N_H_MOLEC == 8);
00215 fmol = (hmi.Hmolec[ipMHm] + 2.*(hmi.H2_total + hmi.Hmolec[ipMH2p]))/dense.gas_phase[ipHYDROGEN];
00216
00217
00218 hmi.BiggestH2 = MAX2(hmi.BiggestH2,(realnum)fmol);
00219
00220
00221 for( i=0; i<mole.num_comole_calc; ++i )
00222 {
00223 if( dense.lgElmtOn[COmole[i]->nelem_hevmol] )
00224 {
00225 realnum frac = COmole[i]->hevmol / SDIV(dense.gas_phase[COmole[i]->nelem_hevmol]);
00226 frac *= (realnum) COmole[i]->nElem[COmole[i]->nelem_hevmol];
00227 COmole[i]->xMoleFracMax = MAX2(frac,COmole[i]->xMoleFracMax);
00228 }
00229 }
00230
00231
00232
00233 t = H21cm_H_atom( phycon.te )* dense.xIonDense[ipHYDROGEN][0] +
00234
00235
00236 H21cm_electron( phycon.te )*dense.eden;
00237
00238
00239 if( t > SMALLFLOAT )
00240 timesc.TimeH21cm = MAX2( 1./t, timesc.TimeH21cm );
00241
00242
00243 if( dense.xIonDense[ipCARBON][0]*dense.xIonDense[ipOXYGEN][0] > SMALLFLOAT )
00244 {
00245 double timemin;
00246 double product = SDIV(dense.xIonDense[ipCARBON][0]*dense.xIonDense[ipOXYGEN][0]);
00247 struct molecule *co_molecule;
00248 co_molecule = findspecies("CO");
00249 timemin = MIN2(timesc.AgeCOMoleDest[co_molecule->index] ,
00250 timesc.AgeCOMoleDest[co_molecule->index] * co_molecule->hevmol/ product );
00251
00252 timesc.BigCOMoleForm = MAX2( timesc.BigCOMoleForm , timemin );
00253 }
00254
00255
00256 timesc.time_H2_Dest_longest = MAX2(timesc.time_H2_Dest_longest, timesc.time_H2_Dest_here );
00257
00258
00259 timesc.time_H2_Form_longest = MAX2( timesc.time_H2_Form_longest , timesc.time_H2_Form_here );
00260
00261
00262
00263
00264 if( thermal.lgUnstable )
00265 thermal.nUnstable += 1;
00266
00267
00268 if( !rfield.lgUSphON && dense.xIonDense[ipHYDROGEN][0]/dense.gas_phase[ipHYDROGEN] > 0.49 )
00269 {
00270 rfield.rstrom = (realnum)radius.Radius;
00271 rfield.lgUSphON = true;
00272 }
00273
00274
00275
00276 DilutionHere = POW2((radius.Radius - radius.drad*radius.dRadSign)/
00277 radius.Radius);
00278
00279 if( trace.lgTrace && trace.lgConBug )
00280 {
00281 fprintf( ioQQQ, " Energy, flux, OTS:\n" );
00282 for( i=0; i < rfield.nflux; i++ )
00283 {
00284 fprintf( ioQQQ, "%6ld%10.2e%10.2e%10.2e", i, rfield.anu[i],
00285 rfield.flux[i] + rfield.outlin[i] + rfield.ConInterOut[i],
00286 rfield.otscon[i] + rfield.otslin[i] + rfield.outlin_noplot[i]);
00287 }
00288 fprintf( ioQQQ, "\n" );
00289 }
00290
00291
00292
00293
00294
00295
00296
00297 # if !defined(NDEBUG)
00298 lgFlxNeg = false;
00299 for( i=0; i < rfield.nflux; i++ )
00300 {
00301 if( rfield.flux[i] < 0. )
00302 {
00303 fprintf( ioQQQ, " radius_increment finds negative intensity in flux.\n" );
00304 fprintf( ioQQQ, " Intensity, frequency, pointer=%11.3e%11.3e%6ld\n",
00305 rfield.flux[i], rfield.anu[i], i );
00306 lgFlxNeg = true;
00307 }
00308 if( rfield.otscon[i] < 0. )
00309 {
00310 fprintf( ioQQQ, " radius_increment finds negative intensity in otscon.\n" );
00311 fprintf( ioQQQ, " Intensity, frequency, pointer=%11.3e%11.3e%6ld\n",
00312 rfield.otscon[i], rfield.anu[i], i );
00313 lgFlxNeg = true;
00314 }
00315 if( opac.tmn[i] < 0. )
00316 {
00317 fprintf( ioQQQ, " radius_increment finds negative tmn.\n" );
00318 fprintf( ioQQQ, " value, frequency, pointer=%11.3e%11.3e%6ld %4.4s\n",
00319 opac.tmn[i], rfield.anu[i], i, rfield.chLineLabel[i] );
00320 lgFlxNeg = true;
00321 }
00322 if( rfield.otslin[i] < 0. )
00323 {
00324 fprintf( ioQQQ, " radius_increment finds negative intensity in otslin.\n" );
00325 fprintf( ioQQQ, " Intensity, frequency, pointer=%11.3e%11.3e%6ld %4.4s\n",
00326 rfield.otslin[i], rfield.anu[i], i, rfield.chLineLabel[i] );
00327 lgFlxNeg = true;
00328 }
00329 if( rfield.outlin[i] < 0. )
00330 {
00331 fprintf( ioQQQ, " radius_increment finds negative intensity in outlin.\n" );
00332 fprintf( ioQQQ, " Intensity, frequency, pointer=%11.3e%11.3e%6ld %4.4s\n",
00333 rfield.outlin[i], rfield.anu[i], i, rfield.chLineLabel[i] );
00334 lgFlxNeg = true;
00335 }
00336 if( rfield.ConInterOut[i] < 0. )
00337 {
00338 fprintf( ioQQQ, " radius_increment finds negative intensity in ConInterOut.\n" );
00339 fprintf( ioQQQ, " Intensity, frequency, pointer=%11.3e%11.3e%6ld %4.4s\n",
00340 rfield.ConInterOut[i], rfield.anu[i], i, rfield.chContLabel[i] );
00341 lgFlxNeg = true;
00342 }
00343 if( opac.opacity_abs[i] < 0. )
00344 {
00345 opac.lgOpacNeg = true;
00346
00347
00348 pnegopc();
00349 }
00350 }
00351 if( lgFlxNeg )
00352 {
00353 fprintf( ioQQQ, " Insanity has occurred, this is zone%4ld\n",
00354 nzone );
00355 ShowMe();
00356 cdEXIT(EXIT_FAILURE);
00357 }
00358
00359 # endif
00360
00361
00362
00363
00364
00365 if( rfield.lgOpacityFine )
00366 {
00367 dradfac = (realnum)radius.drad_x_fillfac;
00368
00369 for( i=0; i<rfield.nfine; ++i )
00370 {
00371 rfield.fine_opt_depth[i] +=
00372 rfield.fine_opac_zone[i]*dradfac;
00373 }
00374
00375
00376
00377
00378 if( opac.lgScatON )
00379 {
00380
00381 for( i=0; i < rfield.nflux-1; i++ )
00382 {
00383
00384
00385
00386 if( rfield.ipnt_coarse_2_fine[i] && rfield.ipnt_coarse_2_fine[i+1] )
00387 {
00388 rfield.trans_coef_zone[i] = 0.;
00389 for( j=rfield.ipnt_coarse_2_fine[i]; j<rfield.ipnt_coarse_2_fine[i+1]; ++j )
00390 {
00391
00392 rfield.trans_coef_zone[i] += 1.f / (1.f + rfield.fine_opac_zone[j]*dradfac );
00393 }
00394
00395
00396
00397 if( rfield.ipnt_coarse_2_fine[i+1]>rfield.ipnt_coarse_2_fine[i] )
00398 {
00399 rfield.trans_coef_zone[i] /= (rfield.ipnt_coarse_2_fine[i+1]-rfield.ipnt_coarse_2_fine[i]);
00400 }
00401 else
00402 {
00403
00404 rfield.trans_coef_zone[i] =
00405 1.f / (1.f + rfield.fine_opac_zone[rfield.ipnt_coarse_2_fine[i]]*dradfac );
00406 }
00407 }
00408 else
00409 {
00410
00411 rfield.trans_coef_zone[i] = 1.f;
00412 }
00413
00414
00415 rfield.trans_coef_total[i] *= rfield.trans_coef_zone[i];
00416 }
00417 }
00418 }
00419
00420
00421 escatc = 6.65e-25*dense.eden;
00422
00423
00424
00425 relec = 0.;
00426 rforce = 0.;
00427 for( i=0; i < rfield.nflux; i++ )
00428 {
00429
00430 opac.TauAbsGeo[0][i] += (realnum)(opac.opacity_abs[i]*radius.drad_x_fillfac);
00431 opac.TauScatGeo[0][i] += (realnum)(opac.opacity_sct[i]*radius.drad_x_fillfac);
00432
00433
00434 opac.TauAbsFace[i] += (realnum)(opac.opacity_abs[i]*radius.drad_x_fillfac);
00435 opac.TauScatFace[i] += (realnum)(opac.opacity_sct[i]*radius.drad_x_fillfac);
00436
00437
00438 opac.TauTotalGeo[0][i] = opac.TauAbsGeo[0][i] + opac.TauScatGeo[0][i];
00439
00440
00441
00442
00443
00444
00445 rforce += (rfield.flux[i] + rfield.outlin[i] + rfield.outlin_noplot[i]+
00446 rfield.ConInterOut[i])* rfield.anu[i]*(opac.opacity_abs[i] +
00447 opac.opacity_sct[i]);
00448
00449 relec += ((rfield.flux[i] + rfield.outlin[i] + rfield.outlin_noplot[i]+
00450 rfield.ConInterOut[i])* escatc)*rfield.anu[i];
00451
00452
00453
00454
00455 opac.ExpZone[i] = sexp(opac.opacity_abs[i]*radius.drad_x_fillfac*
00456 geometry.DirectionalCosin);
00457
00458
00459 opac.ExpmTau[i] *= (realnum)opac.ExpZone[i];
00460
00461
00462 opac.E2TauAbsFace[i] = (realnum)e2(opac.TauAbsFace[i]);
00463 ASSERT( opac.E2TauAbsFace[i] <= 1. && opac.E2TauAbsFace[i] >= 0. );
00464
00465
00466 if( iteration > 1 )
00467 {
00468
00469 realnum tau = MAX2(SMALLFLOAT , opac.TauAbsTotal[i] - opac.TauAbsFace[i] );
00470 opac.E2TauAbsOut[i] = (realnum)e2( tau );
00471 ASSERT( opac.E2TauAbsOut[i]>=0. && opac.E2TauAbsOut[i]<=1. );
00472 }
00473
00474
00475 opfac = opac.ExpZone[i]*DilutionHere;
00476 ASSERT( opfac <= 1.0 );
00477
00478
00479 rfield.flux_beam_const[i] *= (realnum)opfac;
00480 rfield.flux_beam_time[i] *= (realnum)opfac;
00481 rfield.flux_isotropic[i] *= (realnum)opfac;
00482 rfield.flux[i] = rfield.flux_beam_const[i] + rfield.flux_beam_time[i] +
00483 rfield.flux_isotropic[i];
00484
00485
00486 rfield.SummedCon[i] = rfield.flux[i] + rfield.SummedDif[i];
00487
00488
00489 rfield.ConInterOut[i] *= (realnum)opfac;
00490 rfield.outlin[i] *= (realnum)opfac;
00491 rfield.outlin_noplot[i] *= (realnum)opfac;
00492
00493 rfield.ConEmitOut[i] *= (realnum)opfac;
00494 rfield.ConEmitOut[i] += rfield.ConEmitLocal[nzone][i]*(realnum)radius.dVolOutwrd*opac.tmn[i];
00495
00496
00497 rfield.OccNumbIncidCont[i] = rfield.flux[i]*rfield.convoc[i];
00498
00499
00500
00501 rfield.OccNumbDiffCont[i] = rfield.ConEmitLocal[nzone][i]*rfield.convoc[i];
00502
00503
00504 rfield.OccNumbContEmitOut[i] = rfield.ConEmitOut[i]*rfield.convoc[i];
00505 }
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515 if( rfield.flux[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]>SMALLFLOAT &&
00516 (rfield.flux[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]/
00517 SDIV(rfield.flux_total_incident[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]) ) > SMALLFLOAT &&
00518 !opac.lgScatON &&
00519 radius.depth/radius.Radius < 1e-4 )
00520 {
00521
00522
00523
00524
00525
00526 double tau_effec = -log((double)rfield.flux[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]/
00527 (double)opac.tmn[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]/
00528 (double)rfield.flux_total_incident[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]);
00529
00530
00531
00532
00533 double tau_true = opac.TauAbsFace[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]*geometry.DirectionalCosin;
00534
00535
00536
00537 if( fabs( tau_effec - tau_true ) / t > 0.01 &&
00538
00539
00540 fabs(tau_effec-tau_true)>MAX2(0.001,1.-opac.tmn[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][0]-1]) )
00541 {
00542
00543
00544 fprintf( ioQQQ,
00545 " PROBLEM radius_increment Lyman continuum insanity zone %li, effective tau=%g, atomic tau=%g simple tau=%g\n",
00546 nzone,
00547 tau_effec ,
00548 tau_true ,
00549 6.327e-18*(dense.xIonDense[ipHYDROGEN][0]*radius.drad_x_fillfac+colden.colden[ipCOL_H0]) );
00550 TotalInsanity();
00551 }
00552 }
00553
00554
00555
00556
00557 if( opac.lgScatON )
00558 {
00559 for( i=0; i < rfield.nflux; i++ )
00560 {
00561
00562
00563
00564
00565
00566 opfac = 1./(1. + radius.drad_x_fillfac*opac.opacity_sct[i]);
00567 ASSERT( opfac <= 1.0 );
00568 rfield.flux_beam_const[i] *= (realnum)opfac;
00569 rfield.flux_beam_time[i] *= (realnum)opfac;
00570 rfield.flux_isotropic[i] *= (realnum)opfac;
00571 rfield.flux[i] = rfield.flux_beam_const[i] + rfield.flux_beam_time[i] +
00572 rfield.flux_isotropic[i];
00573
00574 rfield.ConInterOut[i] *= (realnum)opfac;
00575 rfield.ConEmitOut[i] *= (realnum)opfac;
00576 rfield.outlin[i] *= (realnum)opfac;
00577 rfield.outlin_noplot[i] *= (realnum)opfac;
00578 }
00579 }
00580
00581
00582 cmshft();
00583
00584
00585 wind.AccelMax = (realnum)MAX2(wind.AccelMax,wind.AccelTot);
00586
00587
00588
00589
00590
00591 relec *= (EN1RYD/SPEEDLIGHT/dense.xMassDensity);
00592 if( relec > SMALLFLOAT )
00593 wind.fmul = (realnum)( (wind.AccelLine + wind.AccelCont) / relec);
00594 else
00595 wind.fmul = 0.;
00596
00597
00598 wind.AccelAver += wind.AccelTot*(realnum)radius.drad_x_fillfac;
00599 wind.acldr += (realnum)radius.drad_x_fillfac;
00600
00601
00602 pressure.pinzon = (realnum)(wind.AccelTot*dense.xMassDensity*radius.drad_x_fillfac*geometry.DirectionalCosin);
00603
00604
00605 pressure.PresInteg += pressure.pinzon;
00606
00607
00608 timesc.sound_speed_isothermal = sqrt(pressure.PresGasCurr/dense.xMassDensity);
00609
00610 timesc.sound_speed_adiabatic = sqrt(5.*pressure.PresGasCurr/(3.*dense.xMassDensity) );
00611 timesc.sound += radius.drad_x_fillfac / timesc.sound_speed_isothermal;
00612
00613
00614 if( hextra.lgNeutrnHeatOn )
00615 {
00616
00617 hextra.totneu *= (realnum)sexp(hextra.CrsSecNeutron*dense.gas_phase[ipHYDROGEN]*radius.drad_x_fillfac*geometry.DirectionalCosin);
00618
00619 hextra.totneu *= (realnum)DilutionHere;
00620 }
00621
00622
00623
00624
00625
00626 if( !geometry.lgSphere )
00627 {
00628 double Reflec_Diffuse_Cont;
00629
00630
00631
00632 for( i=rfield.ipPlasma-1; i < rfield.nflux; i++ )
00633 {
00634 if( opac.TauAbsGeo[0][i] < 30. )
00635 {
00636
00637
00638 Reflec_Diffuse_Cont = rfield.ConEmitLocal[nzone][i]/2.*
00639 radius.drad_x_fillfac * opac.E2TauAbsFace[i]*radius.r1r0sq;
00640
00641
00642 rfield.ConEmitReflec[i] += (realnum)(Reflec_Diffuse_Cont);
00643
00644
00645 rfield.ConRefIncid[i] += (realnum)(rfield.flux[i]*opac.opacity_sct[i]*
00646 radius.drad_x_fillfac*opac.E2TauAbsFace[i]*radius.r1r0sq);
00647
00648
00649 rfield.reflin[i] += (realnum)(rfield.outlin[i]*opac.opacity_sct[i]*
00650 radius.drad_x_fillfac*opac.E2TauAbsFace[i]*radius.r1r0sq);
00651 }
00652 }
00653 }
00654
00655
00656
00657
00658
00659
00660 aver("zone",1.,1.," ");
00661 aver("doit",phycon.te,1.," Te ");
00662 aver("doit",phycon.te,dense.eden," Te(Ne) ");
00663 aver("doit",phycon.te,dense.eden*dense.xIonDense[ipHYDROGEN][1]," Te(NeNp) ");
00664 aver("doit",phycon.te,dense.eden*dense.xIonDense[ipHELIUM][1] ," Te(NeHe+)");
00665 aver("doit",phycon.te,dense.eden*dense.xIonDense[ipHELIUM][2] ,"Te(NeHe2+)");
00666 aver("doit",phycon.te,dense.eden*dense.xIonDense[ipOXYGEN][1] ," Te(NeO+) " );
00667 aver("doit",phycon.te,dense.eden*dense.xIonDense[ipOXYGEN][2] ," Te(NeO2+)");
00668
00669 aver("doit",phycon.te,hmi.H2_total," Te(H2) ");
00670 aver("doit",dense.gas_phase[ipHYDROGEN],1.," N(H) ");
00671 aver("doit",dense.eden,dense.xIonDense[ipOXYGEN][2]," Ne(O2+) ");
00672 aver("doit",dense.eden,dense.xIonDense[ipHYDROGEN][1]," Ne(Np) ");
00673
00674
00675
00676
00677 nzone_minus_1 = MAX2( 0, nzone-1 );
00678
00679 struc.nzone = nzone_minus_1+1;
00680 ASSERT(nzone_minus_1>=0 && nzone_minus_1 < struc.nzlim );
00681 struc.testr[nzone_minus_1] = (realnum)phycon.te;
00682
00683 struc.DenParticles[nzone_minus_1] = dense.pden;
00684
00685 struc.hden[nzone_minus_1] = (realnum)dense.gas_phase[ipHYDROGEN];
00686
00687 struc.DenMass[nzone_minus_1] = dense.xMassDensity;
00688 struc.heatstr[nzone_minus_1] = thermal.htot;
00689 struc.coolstr[nzone_minus_1] = thermal.ctot;
00690 struc.volstr[nzone_minus_1] = (realnum)radius.dVeff;
00691 struc.drad[nzone_minus_1] = (realnum)radius.drad;
00692 struc.drad_x_fillfac[nzone_minus_1] = (realnum)radius.drad_x_fillfac;
00693 struc.histr[nzone_minus_1] = dense.xIonDense[ipHYDROGEN][0];
00694 struc.hiistr[nzone_minus_1] = dense.xIonDense[ipHYDROGEN][1];
00695 struc.ednstr[nzone_minus_1] = (realnum)dense.eden;
00696 struc.o3str[nzone_minus_1] = dense.xIonDense[ipOXYGEN][2];
00697 struc.pressure[nzone_minus_1] = (realnum)pressure.PresTotlCurr;
00698 struc.windv[nzone_minus_1] = (realnum)wind.windv;
00699 struc.AccelTot[nzone_minus_1] = wind.AccelTot;
00700 struc.AccelGravity[nzone_minus_1] = wind.AccelGravity;
00701 struc.pres_radiation_lines_curr[nzone_minus_1] = (realnum)pressure.pres_radiation_lines_curr;
00702 struc.GasPressure[nzone_minus_1] = (realnum)pressure.PresGasCurr;
00703 struc.depth[nzone_minus_1] = (realnum)radius.depth;
00704
00705 struc.xLyman_depth[nzone_minus_1] = opac.TauAbsFace[iso.ipIsoLevNIonCon[ipH_LIKE][ipHYDROGEN][ipH1s]];
00706 for( nelem=ipHYDROGEN; nelem<LIMELM; ++nelem)
00707 {
00708 struc.gas_phase[nelem][nzone_minus_1] = dense.gas_phase[nelem];
00709 for( ion=0; ion<nelem+2; ++ion )
00710 {
00711 struc.xIonDense[nelem][ion][nzone_minus_1] = dense.xIonDense[nelem][ion];
00712 }
00713 }
00714
00715
00716 for(mol=0;mol<N_H_MOLEC;mol++)
00717 {
00718 struc.H2_molec[mol][nzone_minus_1] = hmi.Hmolec[mol];
00719 }
00720
00721
00722 for(mol=0;mol<mole.num_comole_calc;mol++)
00723 {
00724 struc.CO_molec[mol][nzone_minus_1] = COmole[mol]->hevmol;
00725 }
00726
00727 colden.dlnenp += dense.eden*(double)(dense.xIonDense[ipHYDROGEN][1])*radius.drad_x_fillfac;
00728 colden.dlnenHep += dense.eden*(double)(dense.xIonDense[ipHELIUM][1])*radius.drad_x_fillfac;
00729 colden.dlnenHepp += dense.eden*(double)(dense.xIonDense[ipHELIUM][2])*radius.drad_x_fillfac;
00730 colden.dlnenCp += dense.eden*(double)(dense.xIonDense[ipCARBON][1])*radius.drad_x_fillfac;
00731
00732
00733 colden.H0_ov_Tspin += (double)(dense.xIonDense[ipHYDROGEN][0]) / hyperfine.Tspin21cm*radius.drad_x_fillfac;
00734
00735
00736 colden.OH_ov_Tspin += (double)(findspecies("OH")->hevmol) / phycon.te*radius.drad_x_fillfac;
00737
00738
00739 hydro.TexcLya = (realnum)TexcLine( &Transitions[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s] );
00740
00741
00742 if( hydro.TexcLya > phycon.te )
00743 {
00744 hydro.nLyaHot += 1;
00745 if( hydro.TexcLya > hydro.TLyaMax )
00746 {
00747 hydro.TLyaMax = hydro.TexcLya;
00748 hydro.TeLyaMax = (realnum)phycon.te;
00749 hydro.nZTLaMax = nzone;
00750 }
00751 }
00752
00753
00754 colden.colden[ipCOL_HTOT] += (realnum)(dense.gas_phase[ipHYDROGEN]*radius.drad_x_fillfac);
00755 ASSERT( colden.colden[ipCOL_HTOT] >SMALLFLOAT );
00756 colden.colden[ipCOL_HMIN] += hmi.Hmolec[ipMHm]*(realnum)radius.drad_x_fillfac;
00757
00758
00759 colden.colden[ipCOL_H2g] += hmi.Hmolec[ipMH2g]*(realnum)radius.drad_x_fillfac;
00760 colden.colden[ipCOL_H2s] += hmi.Hmolec[ipMH2s]*(realnum)radius.drad_x_fillfac;
00761
00762 colden.coldenH2_ov_vel += hmi.H2_total*(realnum)radius.drad_x_fillfac / DoppVel.doppler[LIMELM+2];
00763 colden.colden[ipCOL_HeHp] += hmi.Hmolec[ipMHeHp]*(realnum)radius.drad_x_fillfac;
00764 colden.colden[ipCOL_H2p] += hmi.Hmolec[ipMH2p]*(realnum)radius.drad_x_fillfac;
00765 colden.colden[ipCOL_H3p] += hmi.Hmolec[ipMH3p]*(realnum)radius.drad_x_fillfac;
00766 colden.colden[ipCOL_Hp] += dense.xIonDense[ipHYDROGEN][1]*(realnum)radius.drad_x_fillfac;
00767 colden.colden[ipCOL_H0] += dense.xIonDense[ipHYDROGEN][0]*(realnum)radius.drad_x_fillfac;
00768
00769 colden.colden[ipCOL_elec] += (realnum)(dense.eden*radius.drad_x_fillfac);
00770
00771 colden.He123S += dense.xIonDense[ipHELIUM][1]*
00772 StatesElem[ipHE_LIKE][ipHELIUM][ipHe2s3S].Pop*(realnum)radius.drad_x_fillfac;
00773
00774
00775 h2.ortho_colden += h2.ortho_density*radius.drad_x_fillfac;
00776 h2.para_colden += h2.para_density*radius.drad_x_fillfac;
00777 ASSERT( fabs( h2.ortho_density + h2.para_density - hmi.H2_total ) / SDIV( hmi.H2_total ) < 1e-4 );
00778
00779
00780
00781
00782
00783 colden.H0_21cm_upper += (HFLines[0].Hi->Pop*radius.drad_x_fillfac);
00784 colden.H0_21cm_lower +=(HFLines[0].Lo->Pop*radius.drad_x_fillfac);
00785
00786
00787
00788
00789
00790 for( i=0; i < 5; i++ )
00791 {
00792
00793 colden.C2Colden[i] += colden.C2Pops[i]*(realnum)radius.drad_x_fillfac;
00794
00795 colden.Si2Colden[i] += colden.Si2Pops[i]*(realnum)radius.drad_x_fillfac;
00796 }
00797 for( i=0; i < 3; i++ )
00798 {
00799
00800 colden.C1Colden[i] += colden.C1Pops[i]*(realnum)radius.drad_x_fillfac;
00801
00802 colden.O1Colden[i] += colden.O1Pops[i]*(realnum)radius.drad_x_fillfac;
00803 }
00804 for( i=0; i < 4; i++ )
00805 {
00806
00807 colden.C3Colden[i] += colden.C3Pops[i]*(realnum)radius.drad_x_fillfac;
00808 }
00809
00810
00811 molcol("ADD ",ioQQQ);
00812
00813
00814 MeanInc();
00815
00816
00817
00818
00819 avWeight = 0.;
00820 for( nelem=0; nelem < LIMELM; nelem++ )
00821 {
00822 avWeight += dense.gas_phase[nelem]*dense.AtomicWeight[nelem];
00823 }
00824 avWeight /= dense.gas_phase[ipHYDROGEN];
00825
00826
00827 rfield.opac_mag_B_point = 0.;
00828 rfield.opac_mag_V_point = 0.;
00829 rfield.opac_mag_B_extended = 0.;
00830 rfield.opac_mag_V_extended = 0.;
00831 long int nd;
00832 for( nd=0; nd < gv.nBin; nd++ )
00833 {
00834
00835
00836
00837
00838
00839 rfield.extin_mag_B_point += (gv.bin[nd]->dstab1[rfield.ipB_filter-1] +
00840 gv.bin[nd]->pure_sc1[rfield.ipB_filter-1])*gv.bin[nd]->dstAbund*
00841 radius.drad_x_fillfac*dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00842 rfield.opac_mag_B_point += (gv.bin[nd]->dstab1[rfield.ipB_filter-1] +
00843 gv.bin[nd]->pure_sc1[rfield.ipB_filter-1])*gv.bin[nd]->dstAbund*
00844 dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00845
00846 rfield.extin_mag_V_point += (gv.bin[nd]->dstab1[rfield.ipV_filter-1] +
00847 gv.bin[nd]->pure_sc1[rfield.ipV_filter-1])*gv.bin[nd]->dstAbund*
00848 radius.drad_x_fillfac*dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00849
00850 rfield.opac_mag_V_point += (gv.bin[nd]->dstab1[rfield.ipV_filter-1] +
00851 gv.bin[nd]->pure_sc1[rfield.ipV_filter-1])*gv.bin[nd]->dstAbund*
00852 dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00853
00854
00855
00856
00857 rfield.extin_mag_B_extended += (gv.bin[nd]->dstab1[rfield.ipB_filter-1] +
00858 gv.bin[nd]->pure_sc1[rfield.ipB_filter]*gv.bin[nd]->asym[rfield.ipB_filter-1] )*gv.bin[nd]->dstAbund*
00859 radius.drad_x_fillfac*dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00860 rfield.opac_mag_B_extended += (gv.bin[nd]->dstab1[rfield.ipB_filter-1] +
00861 gv.bin[nd]->pure_sc1[rfield.ipB_filter]*gv.bin[nd]->asym[rfield.ipB_filter-1] )*gv.bin[nd]->dstAbund*
00862 dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00863
00864 rfield.extin_mag_V_extended += (gv.bin[nd]->dstab1[rfield.ipV_filter-1] +
00865 gv.bin[nd]->pure_sc1[rfield.ipV_filter]*gv.bin[nd]->asym[rfield.ipV_filter-1] )*gv.bin[nd]->dstAbund*
00866 radius.drad_x_fillfac*dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00867 rfield.opac_mag_V_extended += (gv.bin[nd]->dstab1[rfield.ipV_filter-1] +
00868 gv.bin[nd]->pure_sc1[rfield.ipV_filter]*gv.bin[nd]->asym[rfield.ipV_filter-1] )*gv.bin[nd]->dstAbund*
00869 dense.gas_phase[ipHYDROGEN] * OPTDEP2EXTIN;
00870
00871 gv.bin[nd]->avdust += gv.bin[nd]->tedust*(realnum)radius.drad_x_fillfac;
00872 gv.bin[nd]->avdft += gv.bin[nd]->DustDftVel*(realnum)radius.drad_x_fillfac;
00873 gv.bin[nd]->avdpot += (realnum)(gv.bin[nd]->dstpot*EVRYD*radius.drad_x_fillfac);
00874 gv.bin[nd]->avDGRatio += (realnum)(gv.bin[nd]->dustp[1]*gv.bin[nd]->dustp[2]*
00875 gv.bin[nd]->dustp[3]*gv.bin[nd]->dustp[4]*gv.bin[nd]->dstAbund/avWeight*
00876 radius.drad_x_fillfac);
00877 }
00878
00879
00880 colden.TotMassColl += dense.xMassDensity*(realnum)radius.drad_x_fillfac;
00881 colden.tmas += (realnum)phycon.te*dense.xMassDensity*(realnum)radius.drad_x_fillfac;
00882 colden.wmas += dense.wmole*dense.xMassDensity*(realnum)radius.drad_x_fillfac;
00883
00884
00885 rjeans = 7.79637 + (phycon.alogte - log10(dense.wmole) - log10(dense.xMassDensity*
00886 geometry.FillFac))/2.;
00887
00888
00889 ajmass = 3.*(rjeans - 0.30103) + log10(4.*PI/3.*dense.xMassDensity*
00890 geometry.FillFac);
00891
00892
00893 colden.rjnmin = MIN2(colden.rjnmin,(realnum)rjeans);
00894 colden.ajmmin = MIN2(colden.ajmmin,(realnum)ajmass);
00895
00896 if( trace.lgTrace )
00897 {
00898 fprintf( ioQQQ, " radius_increment returns\n" );
00899 }
00900 return;
00901 }
00902
00903 #if !defined(NDEBUG)
00904
00905 STATIC void pnegopc(void)
00906 {
00907 long int i;
00908 FILE *ioFile;
00909
00910 DEBUG_ENTRY( "pnegopc()" );
00911
00912 if( opac.lgNegOpacIO )
00913 {
00914
00915 ioFile = open_data( "negopc.txt", "w", AS_LOCAL_ONLY );
00916 for( i=0; i < rfield.nflux; i++ )
00917 {
00918 fprintf( ioFile, "%10.2e %10.2e \n", rfield.anu[i],
00919 opac.opacity_abs[i] );
00920 }
00921 fclose( ioFile);
00922 }
00923 return;
00924 }
00925 #endif
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935 STATIC void cmshft(void)
00936 {
00937 long int i;
00938
00939 DEBUG_ENTRY( "cmshft()" );
00940
00941
00942 if( rfield.comoff == 0. )
00943 {
00944 return;
00945 }
00946
00947 if( rfield.comoff != 0. )
00948 {
00949 return;
00950 }
00951
00952
00953 for( i=0; i < rfield.nflux; i++ )
00954 {
00955 continue;
00956
00957
00958 }
00959 return;
00960 }