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 const int 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;
379 for(
long ion=
dense.
IonHigh[nelem]+1; ion<nelem+1; ++ion )
411 (*diatom)->CalcPhotoionizationRate();
469 bool lgShortCircuit =
false;
470 for( ion_loop=0; ion_loop<nconv && !lgShortCircuit; ++ion_loop)
475 for (
long ion = 0; ion <= nelem+1; ++ion)
516 if (fabs(netion) > ion_cmp &&
525 bool lgCanShortCircuit = (ion_loop+1 < nconv);
533 double x0 = xIonDense0[ion_loop][nelem][ion];
537 lgCanShortCircuit =
false;
542 lgShortCircuit = lgCanShortCircuit;
552 double tot0 = 0., tot1 = 0.;
554 for (
long ion = 0; ion <= nelem+1; ++ion)
556 double x0 = xIonDense0[nconv-2][nelem][ion];
557 double x1 = xIonDense0[nconv-1][nelem][ion];
565 double extstep = 0.,predict=
x2,
566 step0 =
x1-
x0, step1 =
x2-
x1, abs1 = fabs(step1);
568 if ( abs1 > 1000.0*((
double)DBL_EPSILON)*
x2 )
570 double denom = fabs(step1-step0);
571 double sgn = (step1*step0 > 0)? 1.0 : -1.0;
574 const double MAXACC=100.0;
575 double extfac = 1.0/(denom/abs1 + 1.0/MAXACC);
576 extstep = sgn*extfac*step1;
578 predict =
x2+extstep;
580 xIonNew[ion] = predict;
584 if ( (nelem ==
ipNICKEL && ion <=2 ) )
585 fprintf(
ioQQQ,
"Extrap %3ld %3ld %13.6g %13.6g %13.6g %13.6g %13.6g %13.6g\n",
587 x0,
x0-xIonDense0[nconv-3][nelem][ion],
x1-
x0,
x2-
x1,extstep,predict);
588 tot1 += xIonNew[ion];
592 double scal = tot0/tot1;
593 for (
long ion = 0; ion <= nelem+1; ++ion)
605 bool lgPostExtrapSolve =
true;
606 if (lgPostExtrapSolve)
657 bool lgPopsConverged =
true;
658 double old_val, new_val;
659 (*diatom)->H2_LevelPops( lgPopsConverged, old_val, new_val );
660 if( !lgPopsConverged )
676 static double OldDeut[2] = {0., 0.};
677 for(
long ion=0; ion<2; ++ion )
694 for(
long nelem=ipISO; nelem<
LIMELM; ++nelem )
704 " ConvBase4 ionization driver loop_ion %li converged? %c reason not converged %s\n" ,
765 hminus_old = hminus_den;
807 OldSumOTS[0] = OldSumOTS[1];
808 OldSumOTS[1] = SumOTS;
835 if( (OldSumOTS[0]-OldSumOTS[1]) * ( OldSumOTS[1] - SumOTS ) < 0. )
857 enum {DEBUG_LOC=
false};
858 if( DEBUG_LOC && (
nzone>110) )
878 enum {DEBUG_LOC=
false};
879 if( DEBUG_LOC && (
nzone>200) )
881 fprintf(
ioQQQ,
"debug otsss\t%li\t%.3e\t%.3e\t%.3e\n",
883 iso_sp[0][1].trans(15,3).Emis().ots(),
914 " 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",
938 fprintf(
ioQQQ,
" PROBLEM ConvBase sets lgAbort since nPres2Ioniz exceeds limPres2Ioniz. ");
940 fprintf(
ioQQQ,
" Reset this limit with the SET PRES IONIZ command.\n");
978 (EdenFromMolecOld-EdenFromGrainsOld),
1013 sprintf( chConvIoniz,
"ch %-4.4s",
mole_global.
list[i]->label.c_str() );
1025 for(
long nelem=ipISO; nelem<
LIMELM;++nelem )
1033 if( fabs(
iso_sp[ipISO][nelem].st[0].Pop()-save_iso_grnd[ipISO][nelem])/
SDIV(
iso_sp[ipISO][nelem].st[0].Pop())-1. >
1037 sprintf( chConvIoniz,
"iso %2li %2li",ipISO, nelem );
1039 save_iso_grnd[ipISO][nelem],
1040 iso_sp[ipISO][nelem].st[0].Pop());
1064 fprintf(
ioQQQ ,
"ABORT flag set since STOP nTotalIoniz was set and reached.\n");
1072 static int iter_punch=-1;
1079 "%li\t%.4e\t%.4e\t%.4e\n",
1094 for(
long nelem=0; nelem<
LIMELM; ++nelem )
1096 for(
long ion=0; ion<nelem+1; ++ion )
1106 for(
long i=0; i <
nUTA; ++i )
1116 enum {DEBUG_LOC=
false};
1120 fprintf(
ioQQQ,
"DEBUG UTA %3i %3i %.3f %.2e %.2e %.2e\n",
1122 rateone,
UTALines[i].Coll().heat(),
1147 double ionsrc = 0., ionsnk = 0.;
1148 for(
long nelem=0; nelem <
LIMELM; ++nelem )
1154 for(
long ion_from = 0; ion_from <= nelem + 1; ++ion_from )
1156 for(
long ion_to = 0; ion_to <= nelem + 1; ++ion_to )
1158 if( ion_to-ion_from > 0 )
1163 else if( ion_to-ion_from < 0 )
1172 const double totsrc = ionsrc +
mole.
species[ipMElec].src;
1174 const double diff = (totsrc - totsnk);
1175 const double ave = ( fabs(totsrc) + fabs(totsnk) )/2.;
1177 const double error_allowed = 0.05 * ave;
1178 if( fabs(diff) > error_allowed )
1180 enum {DEBUG_LOC=
false};
1183 fprintf(
ioQQQ,
"PROBLEM large NetEdenSrc nzone %li\t%e\t%e\t%e\t%e\n",
1185 totsrc/
SDIV(totsnk),
double ChargTranSumHeat(void)
const int INPUT_LINE_LENGTH
bool fp_equal(sys_float x, sys_float y, int n=3)
sys_float SDIV(sys_float x)
#define DEBUG_ENTRY(funcname)
realnum GrainChTrRate[LIMELM][LIMELM+1][LIMELM+1]
double ** UTA_ionize_rate
double RateIonizTot(long nelem, long ion)
valarray< class molezone > species
STATIC bool lgNetEdenSrcSmall(void)
void CoolEvaluate(double *tot)
bool lgElemsConserved(void)
void lgStatesConserved(long nelem, long ionStage, qList states, long numStates, realnum err_tol, long loop_ion)
void SetDeuteriumIonization(const double &xNeutral, const double &xIonized)
t_elementnames elementnames
vector< diatomics * > diatoms
vector< diatomics * >::iterator diatom_iter
void ion_recom_calculate(void)
void ion_wrapper(long nelem)
void ion_trim(long int nelem)
t_iso_sp iso_sp[NISO][LIMELM]
void iso_update_rates(void)
void iso_collapsed_update(void)
void iso_renorm(long nelem, long ipISO, double &renorm)
t_mole_global mole_global
molezone * findspecieslocal(const char buf[])
void mole_update_sources(void)
molecule * findspecies(const char buf[])
void OpacityAddTotal(void)
void PresTotCurrent(void)
void RT_OTS_PrtRate(double weak, int chFlag)
void RT_OTS_Update(double *SumOTS)
t_secondaries secondaries
double CharExcRecTo[NCX][LIMELM][LIMELM+1]
double CharExcIonOf[NCX][LIMELM][LIMELM+1]
realnum IonizErrorAllowed
void incrementCounter(const counter_type type)
bool lgFirstSweepThisZone
void setConvIonizFail(const char *reason, double oldval, double newval)
const char * chConvIoniz() const
realnum HeatCoolRelErrorAllowed
realnum SetIoniz[LIMELM][LIMELM+1]
long int IonLow[LIMELM+1]
long int IonHigh[LIMELM+1]
double xIonDense[LIMELM][LIMELM+1]
realnum gas_phase[LIMELM]
char chElementSym[LIMELM][CHARS_ELEMENT_SYM]
bool lgTraceConvergeBaseHash
char chHashString[INPUT_LINE_LENGTH]
FILE * ipTraceConvergeBase
bool lgTemperatureConstant
TransitionList UTALines("UTALines", &AnonStates)
TransitionList TauLines("TauLines", &AnonStates)
void DumpLine(const TransitionProxy &t)