39 static double HeatOld=-1. , CoolOld=-1.;
56 double HeatRelChange = fabs(HeatChange)/
SDIV( HeatCoolMax );
57 double CoolRelChange = fabs(CoolChange)/
SDIV( HeatCoolMax );
58 bool lgConverged =
true;
77 bool lgConvergeCoolHeat =
false;
90 fprintf(
ioQQQ,
" lgCoolNetConverge %li calls to ConvEdenIoniz, converged? %c\n",
91 loop ,
TorF( lgConvergeCoolHeat ) );
124 fprintf(
ioQQQ,
"PROBLEM CoolNet derivative oscillating in initial solution "\
125 "Te=%.3e dCoolNetDT=%.3e CoolNet=%.3e dCooldT=%.3e dHeatdT=%.3e\n",
131 return lgConvergeCoolHeat;
145 for( molecule::nAtomsMap::iterator atom=
mole_global.
list[i]->nAtom.begin();
148 long nelem = atom->first->el->Z-1;
176 enum {DEBUG_LOC=
false};
179 fprintf(
ioQQQ,
"DEBUG fraction molecular %.2e species %li O ices %.2e\n" ,
189 double TeChangeFactor;
213 TeChangeFactor = 0.999;
217 TeChangeFactor = 0.99;
224 TeChangeFactor = 0.97;
231 TeChangeFactor = 0.95;
236 TeChangeFactor = 0.8;
238 return TeChangeFactor;
251 bool lgConvergeCoolHeat;
303 fprintf(
ioQQQ,
"\nConvInitSolution entered \n" );
315 fprintf(
ioQQQ,
" ConvInitSolution called, ITER=%2ld resetting Te to %10.2e\n",
321 fprintf(
ioQQQ,
" search set true\n" );
347 fprintf(
ioQQQ,
" ========================================================================================================================\n");
348 fprintf(
ioQQQ,
" ConvInitSolution: search set false 2 Te=%.3e========================================================================================\n" ,
phycon.
te);
349 fprintf(
ioQQQ,
" ========================================================================================================================\n");
375 const bool lgDoInitConv =
true;
383 fprintf(
ioQQQ,
" ConvInitSolution called, new temperature.\n" );
410 TeFirst =
MAX2( 4000. , TeFirst );
419 TeFirst =
MIN2( 1e6 , TeBoundHigh );
424 TeFirst =
MAX2( 4000., TeBoundLow );
436 fprintf(
ioQQQ,
"ConvInitSolution doing initial solution with temp=%.2e\n",
450 double CoolNet=0, dCoolNetDT=0;
452 lgConvergeCoolHeat =
false;
453 for( ionlup=0; ionlup<2; ++ionlup )
456 fprintf(
ioQQQ,
"ConvInitSolution calling lgCoolNetConverge "
457 "initial setup %li with Te=%.3e C=%.2e H=%.2e d(C-H)/dT %.3e\n",
470 if( !lgConvergeCoolHeat )
471 fprintf(
ioQQQ,
" PROBLEM ConvInitSolution did not converge the heating-cooling during initial search.\n");
476 fprintf(
ioQQQ,
" DISASTER PROBLEM ConvInitSolution: Search for "
477 "initial conditions aborted - lgAbort set true.\n" );
487 bool lgConvergedLoop =
false;
488 long int LoopThermal = 0;
492 const long int LIMIT_THERMAL_LOOP=300;
493 double CoolMHeatSave=-1. , TempSave=-1. , TeNew=-1.,
CoolSave=-1;
494 while( !lgConvergedLoop && LoopThermal < LIMIT_THERMAL_LOOP )
497 CoolMHeatSave = CoolNet;
504 ASSERT( TeChangeFactor>0. && TeChangeFactor< 1. );
506 TeNew =
phycon.
te - CoolNet / dCoolNetDT;
515 fprintf(
ioQQQ,
"ConvInitSolution %4li TeNnew=%.3e "
516 "TeChangeFactor=%.3e Cnet/H=%.2e dCnet/dT=%10.2e Ne=%.3e"
517 " Ograins %.2e FracMoleMax %.2e\n",
518 LoopThermal , TeNew , TeChangeFactor ,
531 lgConvergedLoop =
true;
532 else if( (CoolNet/fabs(CoolNet))*(CoolMHeatSave/fabs(CoolMHeatSave)) <= 0)
534 lgConvergedLoop =
true;
536 lgConvergedLoop =
true;
540 if( !lgConvergedLoop )
541 fprintf(
ioQQQ,
"PROBLEM ConvInitSolution: temperature solution not "
542 "found in initial search, final Te=%.2e\n",
552 fprintf(
ioQQQ,
" Change in sign of C-H found, Te brackets %.3e "
553 "%.3e Cool brackets %.3e %.3e ",
554 TempSave ,
phycon.
te , CoolMHeatSave , CoolNet);
568 double TeLn = (log(
thermal.
htot ) - Alog) / alpha ;
576 TeNew = pow(
EE , TeLn );
583 fprintf(
ioQQQ,
" interpolating to Te %.3e \n\n",
614 fprintf(
ioQQQ,
"\nConvInitSolution: end 1st iteration search phase "
620 fprintf(
ioQQQ,
" ConvInitSolution return, TE:%10.2e==================\n",
648 " PresTotCurrent 1st zn old values of PresTotlInit:%.3e"
660 static double PresTotalInitTime;
733 for( nelem=2; nelem <
LIMELM; nelem++ )
736 for( i=0; i < nelem; i++ )
743 nelem_reflux = nelem;
774 fprintf(
ioQQQ,
" nflux updated from %li to %li, anu from %g to %g \n",
777 fprintf(
ioQQQ,
" caused by element %li ion %li \n",
778 nelem_reflux ,ion_reflux );
789 static const double PCHNG = 0.98;
bool fp_equal(sys_float x, sys_float y, int n=3)
NORETURN void TotalInsanity(void)
sys_float SDIV(sys_float x)
#define DEBUG_ENTRY(funcname)
valarray< class molezone > species
void rfield_opac_zero(long lo, long ihi)
int ConvTempEdenIoniz(void)
int ConvPresTempEdenIoniz(void)
static double OxyInGrains
STATIC bool lgCoolHeatCheckConverge(double *CoolNet, bool lgReset)
STATIC bool lgCoolNetConverge(double *CoolNet, double *dCoolNetDT, bool lgReset)
static double dCoolNetDTOld
STATIC void ChemImportance(void)
static double FracMoleMax
double FindTempChangeFactor(void)
void CoolSave(FILE *io, char chJob[])
void set_NaN(sys_float &x)
static const long LOOP_MAX
t_mole_global mole_global
ChemAtomList unresolved_atom_list
void PresTotCurrent(void)
long int ipHeavy[LIMELM][LIMELM]
bool lgFirstSweepThisZone
long int nTotalIoniz_start
realnum AverHeatCoolError
realnum HeatCoolRelErrorAllowed
double PressureVaryTimeTimescale
double PressureVaryTimeIndex
double xIonDense[LIMELM][LIMELM+1]
realnum gas_phase[LIMELM]
bool lgTimeDependentStatic
const double TEMP_LIMIT_HIGH
const double TEMP_LIMIT_LOW
double PressureInitialSpecified
bool lgPressureInitialSpecified
bool lgTemperatureConstant
void TempChange(double TempNew, bool lgForceUpdate)