31 if (
dense.lgElmtOn[nelem])
35 if ((
dense.IonHigh[nelem] >= nelem - ipISO &&
36 dense.IonLow[nelem] <= nelem - ipISO) || !
conv.nTotalIoniz)
55 if (!
dense.lgElmtOn[nelem])
59 if ((
dense.IonHigh[nelem] >= nelem - ipISO &&
60 dense.IonLow[nelem] <= nelem - ipISO) || !
conv.nTotalIoniz)
68 if(
iso_ctrl.lgContinuumLoweringEnabled[ipISO] && !
conv.nPres2Ioniz )
87 ionbal.RateRecomTot[nelem][nelem-ipISO] =
ionbal.RateRecomIso[nelem][ipISO];
94 for( vector<two_photon>::iterator tnu = sp->
TwoNu.begin(); tnu != sp->
TwoNu.end(); ++tnu )
108 if(
dense.lgElmtOn[nelem] )
112 if( (
dense.IonHigh[nelem] >= nelem - ipISO) &&
113 (
dense.IonLow[nelem] <= nelem - ipISO) )
118 if (fabs(renorm-1.0) > maxerr)
119 maxerr = fabs(renorm-1.0);
128 iso_sp[ipISO][nelem].st[0].Pop() = 0.;
129 for(
long ipHi=1; ipHi <
iso_sp[ipISO][nelem].numLevels_max; ipHi++ )
131 iso_sp[ipISO][nelem].st[ipHi].Pop() = 0.;
132 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
134 if(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul() <=
iso_ctrl.SmallA )
138 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().PopOpc() = 0.;
161 enum {DEBUG_LOC=
false};
165 fprintf(
ioQQQ,
"DEBUG \t%.2f\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
171 hmi.H2_Solomon_dissoc_rate_used_H2g,
172 hmi.H2_Solomon_dissoc_rate_BD96_H2g,
173 hmi.H2_Solomon_dissoc_rate_TH85_H2g);
213 hydro.lgHiPop2 =
true;
227 hydro.H_ion_frac_photo =
231 hydro.H_ion_frac_collis =
244 hydro.H_ion_frac_collis = 0.;
245 hydro.H_ion_frac_photo = 0.;
252 fprintf(
ioQQQ,
" Hydrogenic return %.2f ",
fnzone);
255 fprintf(
ioQQQ,
"H2:%.3e ",
hmi.H2_total);
258 fprintf(
ioQQQ,
" REC, COL, GAMT= ");
261 fprintf(
ioQQQ,
"%.2e ", coltot);
262 fprintf(
ioQQQ,
"%.2e ", gamtot);
263 fprintf(
ioQQQ,
" CSUP=");
265 fprintf(
ioQQQ,
"\n");
276 const bool lgJustAssert =
false, lgJustTest =
true;
290 for(
long level=0; level <
iso_sp[ipISO][nelem].numLevels_local; level++ )
293 sum_atom_iso +=
iso_sp[ipISO][nelem].st[level].Pop();
302 sum_atom_iso = 0.5*
dense.xIonDense[nelem][nelem-ipISO];
306 iso_sp[ipISO][nelem].st[0].Pop() = sum_atom_iso;
310 renorm =
dense.xIonDense[nelem][nelem-ipISO] / sum_atom_iso;
316 fprintf (
ioQQQ,
"Iso_Renorm %ld %ld %g %g %g[%g]\n",
317 ipISO,nelem,renorm-1.,
318 dense.xIonDense[nelem][nelem-ipISO], sum_atom_iso,
319 iso_sp[ipISO][nelem].st[0].Pop());
326 fabs(renorm - 1.0) >
conv.IonizErrorAllowed)
328 conv.setConvIonizFail(
"Iso vs. ion",
329 dense.xIonDense[nelem][nelem-ipISO],
342 for(
long ipHi=0; ipHi <
iso_sp[ipISO][nelem].numLevels_local; ipHi++ )
344 iso_sp[ipISO][nelem].st[ipHi].Pop() *= renorm;
348 for(
long ipHi=0; ipHi <
iso_sp[ipISO][nelem].numLevels_local; ipHi++ )
350 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
352 if(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul() <=
iso_ctrl.SmallA )
356 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().PopOpc() *= renorm;
367 for(
long level=0; level <
iso_sp[ipISO][nelem].numLevels_local; level++ )
369 double denom =
dense.xIonDense[nelem][nelem+1-ipISO]*
374 iso_sp[ipISO][nelem].st[level].Pop(), denom );
376 iso_sp[ipISO][nelem].fb[level].DepartCoef = 0.;
379 for(
long level=
iso_sp[ipISO][nelem].numLevels_local; level <
iso_sp[ipISO][nelem].numLevels_max; level++ )
380 iso_sp[ipISO][nelem].fb[level].DepartCoef = 0.;
388 long int in, il, is, i, ipLo, nResolved, ipFirstCollapsed=LONG_MIN;
389 char chPrtType[2][12]={
"populations",
"departure"};
391 char chSpin[3][9]= {
"singlets",
"doublets",
"triplets"};
393#define ITEM_TO_PRINT(A_) ( lgPrtDeparCoef ? iso_sp[ipISO][nelem].fb[A_].DepartCoef : iso_sp[ipISO][nelem].st[A_].Pop() )
399 for( is = 1; is<=3; ++is)
403 else if( ipISO ==
ipHE_LIKE && is != 1 && is != 3 )
406 ipFirstCollapsed=
iso_sp[ipISO][nelem].numLevels_local-
iso_sp[ipISO][nelem].nCollapsed_local;
407 nResolved =
iso_sp[ipISO][nelem].st[ipFirstCollapsed-1].n();
408 ASSERT( nResolved ==
iso_sp[ipISO][nelem].n_HighestResolved_local );
412 fprintf(
ioQQQ,
" %s %s %s %s\n",
416 chPrtType[lgPrtDeparCoef]);
419 fprintf(
ioQQQ,
" n\\l=> ");
420 for( i =0; i < nResolved; ++i)
422 fprintf(
ioQQQ,
"%2ld ",i);
427 for( in = 1; in <= nResolved; ++in)
432 fprintf(
ioQQQ,
" %2ld ",in);
434 for( il = 0; il < in; ++il)
436 if( ipISO==
ipHE_LIKE && (in==2) && (il==1) && (is==3) )
444 ipLo =
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is];
452 for( il = ipFirstCollapsed; il <
iso_sp[ipISO][nelem].numLevels_local; ++il)
454 in =
iso_sp[ipISO][nelem].st[il].n();
456 fprintf(
ioQQQ,
" %2ld ",in);
471 double TeList[NTE] = {6000.,10000.,15000.,20000.,25000.};
477 fprintf(ioPun,
"Te\t2 3s 33s\n");
482 for( i=0; i<NTE; ++i )
486 fprintf(ioPun ,
"%.0f\t",
488 fprintf(ioPun ,
"%.2f\t",
490 fprintf(ioPun ,
"%.2f\t",
492 fprintf(ioPun ,
"%.2f\t",
494 fprintf(ioPun ,
"%.3f\t",
497 fprintf(ioPun ,
"%.1f\n",
void PrintE82(FILE *, double)
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
bool fp_equal(sys_float x, sys_float y, int n=3)
#define DEBUG_ENTRY(funcname)
vector< two_photon > TwoNu
t_elementnames elementnames
realnum HeCSInterp(long int nelem, long int ipHi, long int ipLo, long int Collider)
void HydroLevel(long int ipZ)
void ion_solver(long int nelem, bool lgPrintIt)
t_iso_sp iso_sp[NISO][LIMELM]
void iso_collide(long ipISO, long nelem)
void iso_continuum_lower(long ipISO, long nelem)
void iso_collapsed_lifetimes_update(long ipISO, long nelem)
void iso_error_generation(long ipISO, long nelem)
void iso_cascade(long ipISO, long nelem)
void iso_collapsed_Aul_update(long ipISO, long nelem)
void iso_collapsed_bnl_set(long ipISO, long nelem)
void iso_ionize_recombine(long ipISO, long nelem)
void iso_photo(long ipISO, long nelem)
void iso_level(const long ipISO, const long nelem, double &renorm)
void iso_radiative_recomb_effective(long ipISO, long nelem)
void iso_radiative_recomb(long ipISO, long nelem)
void iso_update_rates(void)
void iso_departure_coefficients(long ipISO, long nelem)
void iso_collapsed_update(void)
void iso_renorm(long nelem, long ipISO, double &renorm)
void AGN_He1_CS(FILE *ioPun)
#define ITEM_TO_PRINT(A_)
void iso_prt_pops(long ipISO, long nelem, bool lgPrtDeparCoef)
void iso_solve(long ipISO, long nelem, double &maxerr)
molezone * findspecieslocal(const char buf[])
t_secondaries secondaries
void TempChange(double TempNew, bool lgForceUpdate)
void CalcTwoPhotonRates(two_photon &tnu, bool lgDoInduced)