51 for (
long ion = 0; ion <= nelem+1; ++ion)
65 bool lgConverg_v =
false;
78 double abundold=0. , abundnew=0.;
101 for(
long ion=0; ion <= (nelem+1); ++ion )
104 if( OldFracs[nelem][ion]/Abund > 1e-4 &&
110 OldFracs[nelem][ion];
111 change =
MAX2(change, one );
113 if( change>bigchange )
116 abundold = OldFracs[nelem][ion]/Abund;
125 if( change >= delta )
130 ASSERT( abundold>0. && abundnew>0. );
137 for(
long ion=0; ion <= (nelem+1); ++ion )
147 fprintf(
ioQQQ,
" nz %ld loop %ld element %li converged? %c worst %ld change %g\n",
148 nzone, loop_ion, nelem,
TorF(lgConverg_v),ionchg,bigchange);
149 for(
long ion=0; ion<(nelem+1); ++ion )
174 static double SecondOld;
175 static long int nzoneOTS=-1;
176 # define LOOP_ION_LIMIT 10
178 static double SumOTS=0. , OldSumOTS[2]={0.,0.};
181 IonizConverg lgIonizConverg;
229 for(
long nelem=ipISO; nelem<
LIMELM;++nelem )
234 save_iso_grnd[ipISO][nelem] =
iso_sp[ipISO][nelem].
st[0].Pop();
255 " ConvBase called. %.2f Te:%.3e HI:%.3e HII:%.3e H2:%.3e Ne:%.3e htot:%.3e CSUP:%.2e Conv?%c\n",
312 bool lgIonizTrimCalled =
false;
313 static long int nZoneCalled = 0;
333 lgIonizTrimCalled =
true;
347 # if !defined(NDEBUG)
379 for(
long ion=
dense.
IonHigh[nelem]+1; ion<nelem+1; ++ion )
464 bool lgPopsConverged =
true;
465 double old_val, new_val;
466 (*diatom)->H2_LevelPops( lgPopsConverged, old_val, new_val );
467 if( !lgPopsConverged )
477 double xIonDense0[nconv][
LIMELM][LIMELM+1];
478 bool lgShortCircuit =
false;
479 for( ion_loop=0; ion_loop<nconv && !lgShortCircuit; ++ion_loop)
484 for (
long ion = 0; ion <= nelem+1; ++ion)
525 if (fabs(netion) > ion_cmp &&
534 bool lgCanShortCircuit = (ion_loop+1 < nconv);
535 for(
long nelem=
ipHYDROGEN; nelem<LIMELM && lgCanShortCircuit; ++nelem )
542 double x0 = xIonDense0[ion_loop][nelem][ion];
544 if (fabs(x0-x1) > 1e-6*(x0+
x1))
546 lgCanShortCircuit =
false;
551 lgShortCircuit = lgCanShortCircuit;
561 double tot0 = 0., tot1 = 0.;
562 double xIonNew[LIMELM+1];
563 for (
long ion = 0; ion <= nelem+1; ++ion)
565 double x0 = xIonDense0[nconv-2][nelem][ion];
566 double x1 = xIonDense0[nconv-1][nelem][ion];
574 double extstep = 0.,predict=
x2,
575 step0 = x1-
x0, step1 = x2-
x1, abs1 = fabs(step1);
577 if ( abs1 > 1000.0*((
double)DBL_EPSILON)*x2 )
579 double denom = fabs(step1-step0);
580 double sgn = (step1*step0 > 0)? 1.0 : -1.0;
583 const double MAXACC=100.0;
584 double extfac = 1.0/(denom/abs1 + 1.0/MAXACC);
585 extstep = sgn*extfac*step1;
587 predict = x2+extstep;
589 xIonNew[ion] = predict;
593 if ( (nelem ==
ipNICKEL && ion <=2 ) )
594 fprintf(
ioQQQ,
"Extrap %3ld %3ld %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n",
596 x0,x0-xIonDense0[nconv-3][nelem][ion],x1-x0,x2-x1,extstep,predict);
597 tot1 += xIonNew[ion];
601 double scal = tot0/tot1;
602 for (
long ion = 0; ion <= nelem+1; ++ion)
614 bool lgPostExtrapSolve =
true;
615 if (lgPostExtrapSolve)
671 static double OldDeut[2] = {0., 0.};
672 for(
long ion=0; ion<2; ++ion )
689 for(
long nelem=ipISO; nelem<
LIMELM; ++nelem )
699 " ConvBase4 ionization driver loop_ion %li converged? %c reason not converged %s\n" ,
760 hminus_old = hminus_den;
802 OldSumOTS[0] = OldSumOTS[1];
803 OldSumOTS[1] = SumOTS;
830 if( (OldSumOTS[0]-OldSumOTS[1]) * ( OldSumOTS[1] - SumOTS ) < 0. )
852 enum {DEBUG_LOC=
false};
853 if( DEBUG_LOC && (
nzone>110) )
873 enum {DEBUG_LOC=
false};
874 if( DEBUG_LOC && (
nzone>200) )
876 fprintf(
ioQQQ,
"debug otsss\t%li\t%.3e\t%.3e\t%.3e\n",
878 iso_sp[0][1].trans(15,3).Emis().ots(),
909 " ConvBase return. fnzone %.2f nPres2Ioniz %li Te:%.3e HI:%.3e HII:%.3e H2:%.3e Ne:%.3e htot:%.3e CSUP:%.2e Conv?%c reason:%s\n",
933 fprintf(
ioQQQ,
"PROBLEM ConvBase sets lgAbort since nPres2Ioniz exceeds limPres2Ioniz. ");
972 (EdenFromMolecOld-EdenFromGrainsOld),
1007 sprintf( chConvIoniz,
"ch %-4.4s",
mole_global.
list[i]->label.c_str() );
1019 for(
long nelem=ipISO; nelem<
LIMELM;++nelem )
1027 if( fabs(
iso_sp[ipISO][nelem].st[0].Pop()-save_iso_grnd[ipISO][nelem])/
SDIV(
iso_sp[ipISO][nelem].st[0].Pop())-1. >
1031 sprintf( chConvIoniz,
"iso %2li %2li",ipISO, nelem );
1033 save_iso_grnd[ipISO][nelem],
1034 iso_sp[ipISO][nelem].st[0].Pop());
1058 fprintf(
ioQQQ ,
"ABORT flag set since STOP nTotalIoniz was set and reached.\n");
1066 static int iter_punch=-1;
1073 "%li\t%.4e\t%.4e\t%.4e\n",
1088 for(
long nelem=0; nelem<
LIMELM; ++nelem )
1090 for(
long ion=0; ion<nelem+1; ++ion )
1100 for(
long i=0; i <
nUTA; ++i )
1106 ionbal.
UTA_heat_rate[(*UTALines[i].Hi()).nelem()-1][(*UTALines[i].Hi()).IonStg()-1] += rateone*UTALines[i].Coll().heat();
1110 enum {DEBUG_LOC=
false};
1114 fprintf(
ioQQQ,
"DEBUG UTA %3i %3i %.3f %.2e %.2e %.2e\n",
1115 (*UTALines[i].Hi()).nelem() , (*UTALines[i].Hi()).IonStg() , UTALines[i].WLAng() ,
1116 rateone, UTALines[i].Coll().heat(),
1117 UTALines[i].Coll().heat()*
dense.
xIonDense[(*UTALines[i].Hi()).nelem()-1][(*UTALines[i].Hi()).IonStg()-1] );
1141 double ionsrc = 0., ionsnk = 0.;
1142 for(
long nelem=0; nelem <
LIMELM; ++nelem )
1148 for(
long ion_from = 0; ion_from <= nelem + 1; ++ion_from )
1150 for(
long ion_to = 0; ion_to <= nelem + 1; ++ion_to )
1152 if( ion_to-ion_from > 0 )
1157 else if( ion_to-ion_from < 0 )
1166 const double totsrc = ionsrc +
mole.
species[ipMElec].src;
1168 const double diff = (totsrc - totsnk);
1169 const double ave = ( fabs(totsrc) + fabs(totsnk) )/2.;
1171 const double error_allowed = 0.05 * ave;
1172 if( fabs(diff) > error_allowed )
1174 enum {DEBUG_LOC=
false};
1177 fprintf(
ioQQQ,
"PROBLEM large NetEdenSrc nzone %li\t%e\t%e\t%e\t%e\n",
1179 totsrc/
SDIV(totsnk),
void ion_trim(long int nelem)
double RateIonizTot(long nelem, long ion)
t_mole_global mole_global
void RT_OTS_Update(double *SumOTS)
void DumpLine(const TransitionProxy &t)
TransitionList UTALines("UTALines",&AnonStates)
bool lgFirstSweepThisZone
void RT_OTS_PrtRate(double weak, int chFlag)
STATIC bool lgNetEdenSrcSmall(void)
double ChargTranSumHeat(void)
void CoolEvaluate(double *tot)
char chHashString[INPUT_LINE_LENGTH]
molezone * findspecieslocal(const char buf[])
void incrementCounter(const counter_type type)
void lgStatesConserved(long nelem, long ionStage, qList states, long numStates, realnum err_tol, long loop_ion)
double xIonDense[LIMELM][LIMELM+1]
t_elementnames elementnames
t_iso_sp iso_sp[NISO][LIMELM]
void PresTotCurrent(void)
bool lgTemperatureConstant
bool fp_equal(sys_float x, sys_float y, int n=3)
void iso_collapsed_update(void)
const char * chConvIoniz() const
realnum SetIoniz[LIMELM][LIMELM+1]
FILE * ipTraceConvergeBase
molecule * findspecies(const char buf[])
double ** UTA_ionize_rate
long int IonHigh[LIMELM+1]
void OpacityAddTotal(void)
valarray< class molezone > species
realnum IonizErrorAllowed
const int INPUT_LINE_LENGTH
vector< diatomics * > diatoms
void ion_recom_calculate(void)
realnum HeatCoolRelErrorAllowed
void iso_update_rates(void)
char chElementSym[LIMELM][CHARS_ELEMENT_SYM]
realnum gas_phase[LIMELM]
void mole_update_sources(void)
void SetDeuteriumIonization(const double &xNeutral, const double &xIonized)
long int IonLow[LIMELM+1]
TransitionList TauLines("TauLines",&AnonStates)
#define DEBUG_ENTRY(funcname)
void iso_renorm(long nelem, long ipISO, double &renorm)
void ion_wrapper(long nelem)
sys_float SDIV(sys_float x)
void setConvIonizFail(const char *reason, double oldval, double newval)
bool lgElemsConserved(void)
t_secondaries secondaries
bool lgTraceConvergeBaseHash
double CharExcIonOf[NCX][LIMELM][LIMELM+1]
realnum GrainChTrRate[LIMELM][LIMELM+1][LIMELM+1]
double CharExcRecTo[NCX][LIMELM][LIMELM+1]
vector< diatomics * >::iterator diatom_iter