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 }