38 ipLineTypePradMax=-1 ,
40 ipLinePradMax=-LONG_MAX,
48 static double Piso_seq[
NISO]={0.,0.},
68 ipLinePradMax=-LONG_MAX;
82 bool lgMustEvaluate =
false;
86 bool lgMustEvaluateTrivial =
false;
96 lgMustEvaluate =
true;
97 lgMustEvaluateTrivial =
true;
101 static long int nzoneEvaluated=0, iterationEvaluated=0;
104 lgMustEvaluate =
true;
105 lgMustEvaluateTrivial =
true;
107 ipLineTypePradMax = -1;
115 lgMustEvaluate =
true;
121 nzoneEvaluated =
nzone;
147 if( ipISO >= 0 && ipISO<
NISO )
149 for(
long i=1; i<=ion; ++i )
151 long int nelec = nelem+1 - i;
241 fprintf(
ioQQQ,
"DEBUG pressure_total updates AccelTotalOutward to %.2e grav %.2e\n",
260 " PresTotCurrent nzone %li iteration %li lgMustEvaluate:%c "
261 "lgMustEvaluateTrivial:%c "
262 "pressure.lgLineRadPresOn:%c "
263 "rfield.lgDoLineTrans:%c \n",
276 if( lgMustEvaluateTrivial || Piso_seq[ipISO] > TrivialLineRadiationPressure )
278 Piso_seq[ipISO] = 0.;
279 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
288 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
290 if(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont() <= 0 )
297 ( (
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().TauTot() -
299 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Pesc() > FLT_EPSILON*100. )
305 ipLineTypePradMax = 2;
310 ipLinePradMax = ipLo;
312 Piso_seq[ipISO] += RadPres1;
315 enum {DEBUG_LOC=
false};
316 if( DEBUG_LOC && ipISO==
ipH_LIKE && ipLo==3 && ipHi==5 &&
nzone > 260 )
319 "DEBUG prad1 \t%.2f\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t\n",
322 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().PopOpc(),
323 iso_sp[ipISO][nelem].st[ipLo].Pop(),
324 iso_sp[ipISO][nelem].st[ipHi].Pop(),
325 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Pesc());
333 ASSERT( Piso_seq[ipISO] >= 0. );
339 enum {DEBUG_LOC=
false};
341 if( DEBUG_LOC &&
nzone > 260 )
344 "DEBUG prad2 \t%li\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
347 iso_sp[ipISO][ip3].trans(ipLinePradMax,ip2).Emis().PopOpc(),
348 iso_sp[ipISO][ip3].st[0].Pop(),
349 iso_sp[ipISO][ip3].st[2].Pop(),
350 iso_sp[ipISO][ip3].st[3].Pop(),
351 iso_sp[ipISO][ip3].st[4].Pop(),
352 iso_sp[ipISO][ip3].st[5].Pop(),
353 iso_sp[ipISO][ip3].st[6].Pop());
359 "DEBUG prad3\t%.2e\t%li\t%li\t%li\t%li\t%.2e\t%.2e\t%.2e\n",
365 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().PopOpc(),
366 iso_sp[ip4][ip3].st[ip2].Pop(),
367 1.-
iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().Pesc() );
371 if( lgMustEvaluateTrivial || PLevel1 > TrivialLineRadiationPressure )
375 for(
long i=1; i <=
nLevel1; i++ )
377 if( (*
TauLines[i].Hi()).Pop() > 1e-30 )
383 ipLineTypePradMax = 3;
394 if( lgMustEvaluateTrivial || PLevel2 > TrivialLineRadiationPressure )
402 if( (*
TauLine2[i].Hi()).Pop() > 1e-30 )
409 ipLineTypePradMax = 4;
421 if( lgMustEvaluateTrivial || PHfs > TrivialLineRadiationPressure )
426 if( (*
HFLines[i].Hi()).Pop() > 1e-30 )
433 ipLineTypePradMax = 8;
444 if( lgMustEvaluateTrivial || P_H2 > TrivialLineRadiationPressure )
449 P_H2 += (*diatom)->H2_RadPress();
454 ipLineTypePradMax = 9;
462 if( lgMustEvaluateTrivial || P_FeII > TrivialLineRadiationPressure )
468 ipLineTypePradMax = 7;
475 if( lgMustEvaluateTrivial || P_dBase > TrivialLineRadiationPressure )
478 for(
long ipSpecies=0; ipSpecies<
nSpecies; ipSpecies++ )
486 int ipHi = (*tr).ipHi();
489 int ipLo = (*tr).ipLo();
490 if( (*tr).ipCont() > 0 && (*(*tr).Hi()).Pop() > 1e-30 )
496 ipLineTypePradMax = 10;
500 ipLinePradMax = ipLo;
516 ipLineTypePradMax = 0;
529 "PresTotCurrent: negative pressure, constituents follow %e %e %e %e %e \n",
544 " PresTotCurrent, pressure.pbeta = %e, ipLineTypePradMax%li ipLinePradMax=%li \n",
563 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
571 iso_sp[ipISO][nelem].
st[ipHi].Pop() *
587 for(
long i=1; i <=
nLevel1; i++ )
621 " PresTotCurrent zn %.2f Ptot:%.5e Pgas:%.3e Prad:%.3e Pmag:%.3e Pram:%.3e "
622 "gas parts; H:%.2e He:%.2e L1:%.2e L2:%.2e CO:%.2e fs%.2e h2%.2e turb%.2e\n",
693 if( ipLineTypePradMax == 2 )
698 ASSERT( ipLinePradMax>=0 && ip2>=0 && ip3>=0 && ip4>=0 );
702 enum {DEBUG_LOC=
false};
707 fprintf(
ioQQQ,
"DEBUG iso prad\t%li\t%li\tISO,nelem=\t%li\t%li\tnu, no=\t%li\t%li\t%.4e\t%.4e\t%e\t%e\t%e\n",
709 ip4,ip3,ip2,ipLinePradMax,
710 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().TauIn(),
711 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().TauTot(),
712 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().Pesc(),
713 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().Pelec_esc(),
714 iso_sp[ip4][ip3].trans(ip2,ipLinePradMax).Emis().Pdest());
715 if( ip2==5 && ipLinePradMax==4 )
718 fprintf(
ioQQQ,
"hit it\n");
720 fprintf(
ioQQQ,
"DEBUG width %e\n", width);
725 else if( ipLineTypePradMax == 3 )
728 ASSERT( ipLinePradMax>=0 );
732 else if( ipLineTypePradMax == 4 )
735 ASSERT( ipLinePradMax>=0 );
739 else if( ipLineTypePradMax == 5 )
743 else if( ipLineTypePradMax == 6 )
747 else if( ipLineTypePradMax == 7 )
752 else if( ipLineTypePradMax == 8 )
756 ASSERT( ipLinePradMax>=0 );
759 else if( ipLineTypePradMax == 9 )
764 else if( ipLineTypePradMax == 10 )
772 fprintf(
ioQQQ,
" PresTotCurrent ipLineTypePradMax set to %li, this is impossible.\n", ipLineTypePradMax);
781 " PresTotCurrent Pbeta:%.2f due to %s\n",
811 enum{DEBUG_LOC=
false};
814 fprintf(
ioQQQ,
"pressureee%li\t%.4e\t%.4e\t%.4e\t%.3f\t%.3f\t%.3f\n",
826 if( TotalPressure_v< 0. )
831 fprintf(
ioQQQ,
" The negative pressure due to ordered magnetic field overwhelms the total outward pressure - please reconsider the geometry & field.\n");
835 ASSERT( TotalPressure_v > 0. );
double FeIIRadPress(void)
double FeII_InterEnergy(void)
double fudge(long int ipnt)
sys_float SDIV(sys_float x)
#define DEBUG_ENTRY(funcname)
realnum EnergyErg() const
realnum ph1(int i, int j, int k, int l) const
TransitionProxy trans(const long ipHi, const long ipLo)
long int nCollapsed_local
bool lgElemsConserved(void)
realnum GetDopplerWidth(realnum massAMU)
realnum DynaFlux(double depth)
vector< diatomics * > diatoms
vector< diatomics * >::iterator diatom_iter
t_iso_sp iso_sp[NISO][LIMELM]
void Magnetic_evaluate(void)
UNUSED const double SOLAR_MASS
UNUSED const double SPEEDLIGHT
UNUSED const double BOLTZMANN
UNUSED const double EN1RYD
UNUSED const double EVRYD
UNUSED const double GRAV_CONST
double PressureRadiationLine(const TransitionProxy &t, realnum DopplerWidth)
void PresTotCurrent(void)
double RT_line_driving(void)
double RT_LineWidth(const TransitionProxy &t, realnum DopplerWidth)
bool lgStatic(void) const
realnum AccelTotalOutward
bool lgBallistic(void) const
long int nsShells[LIMELM][LIMELM]
realnum PressureErrorAllowed
long int IonLow[LIMELM+1]
long int IonHigh[LIMELM+1]
double xIonDense[LIMELM][LIMELM+1]
realnum AtomicWeight[LIMELM]
bool lgTimeDependentStatic
double pres_radiation_lines_curr
TransitionList TauLine2("TauLine2", &AnonStates)
vector< TransitionList > dBaseTrans
TransitionList HFLines("HFLines", &AnonStates)
TransitionList TauLines("TauLines", &AnonStates)
void TempChange(double TempNew, bool lgForceUpdate)
char * chLineLbl(const TransitionProxy &t)