80 static bool lgFirstCall =
true;
116 for(
long i=0; i <
iterations.iter_malloc; i++ )
139 state.lgGet_state =
false;
140 state.lgPut_state =
false;
141 state.lgState_print =
false;
150 for(
long i=0; i <
iterations.iter_malloc; i++ )
154 radius.StopThickness[i] = 1e31;
155 radius.StopRadius[i] = -1.;
179 conv.nPres2Ioniz = 0;
185 conv.resetCounters();
194 conv.HeatCoolRelErrorAllowed = 0.005f;
197 conv.EdenErrorAllowed = 1e-2;
199 conv.IonizErrorAllowed = 1e-2;
208 conv.nTotalIoniz = 0;
211 conv.BigEdenError = 0.;
212 conv.AverEdenError = 0.;
213 conv.BigHeatCoolError = 0.;
214 conv.AverHeatCoolError = 0.;
215 conv.BigPressError = 0.;
216 conv.AverPressError = 0.;
217 strcpy(
conv.chSolverEden,
"vWDB" );
218 strcpy(
conv.chSolverTemp,
"vWDB" );
219 strcpy(
conv.chNotConverged,
"none" );
220 strcpy(
conv.chConvEden,
"none" );
221 conv.resetConvIoniz();
223 conv.lgAutoIt =
false;
226 conv.lgConvTemp =
true;
227 conv.lgConvPres =
true;
228 conv.lgConvEden =
true;
229 conv.lgUpdateCouplings =
false;
237 timesc.CloudAgeSet = -1.f;
239 timesc.time_H2_Dest_longest = 0.;
240 timesc.time_H2_Form_longest = 0.;
242 timesc.time_H2_Dest_here = -1.;
243 timesc.time_H2_Form_here = 0.;
245 timesc.BigCOMoleForm = 0.;
248 timesc.sound_speed_isothermal = 0.;
280 continuum.lgCoStarInterpolationCaution =
false;
296 hydro.lgHiPop2 =
false;
300 hydro.HCollIonMax = 0.;
306 strcpy(
hydro.chHTopType,
" add" );
314 hydro.DampOnFac = 1.;
318 hydro.lgLymanPumping =
true;
322 hydro.xLymanPumpingScaleFactor = 1.f;
326 hydro.D2H_ratio = 1.65e-5;
330 he.frac_he0dest_23S = 0.;
331 he.frac_he0dest_23S_photo = 0.;
336 iso_ctrl.lgContinuumLoweringEnabled[ipISO] =
true;
339 iso_ctrl.lgCompileRecomb[ipISO] =
false;
340 iso_ctrl.lgNoRecombInterp[ipISO] =
false;
345 iso_ctrl.lgCS_Vrinceanu[ipISO] =
true;
350 iso_ctrl.lgCS_therm_ave[ipISO] =
false;
357 iso_ctrl.lgCritDensLMix[ipISO] =
true;
362 iso_ctrl.lgRandErrGen[ipISO] =
false;
372 iso_ctrl.nLyman_malloc[ipISO] = 100;
375 iso_ctrl.lgColl_l_mixing[ipISO] =
true;
376 iso_ctrl.lgColl_excite[ipISO] =
true;
377 iso_ctrl.lgColl_ionize[ipISO] =
true;
378 iso_ctrl.lgLTE_levels[ipISO] =
false;
379 iso_ctrl.lgPrintNumberOfLevels =
false;
405 iso_ctrl.lgPessimisticErrors =
false;
409 iso_ctrl.lgCollStrenThermAver =
false;
440 for(
long ion=0; ion<nelem+1; ++ion )
458 ionbal.CompRecoilIonRate =
460 ionbal.CompRecoilIonRateSave =
462 ionbal.CompRecoilHeatRate =
464 ionbal.CompRecoilHeatRateSave =
467 (
double****)
MALLOC(
sizeof(
double***)*(
unsigned)
LIMELM );
468 ionbal.CollIonRate_Ground =
497 for(
long nelem=0; nelem<
LIMELM; ++nelem )
499 ionbal.DR_Badnell_rate_coef[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
500 ionbal.RR_Badnell_rate_coef[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
501 ionbal.CX_recomb_rate_used[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
503 ionbal.RateIoniz[nelem] = (
double **)
MALLOC(
sizeof(
double *)*(
unsigned)(nelem+1) );
504 ionbal.RateRecomTot[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
506 for(
long ion=0; ion<nelem+1; ++ion )
508 ionbal.RateIoniz[nelem][ion] = (
double *)
MALLOC(
sizeof(
double )*(
unsigned)(nelem+2) );
509 for(
long ion2=0; ion2<nelem+2; ++ion2 )
510 ionbal.RateIoniz[nelem][ion][ion2] = 0.;
513 ionbal.RR_rate_coef_used[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
514 ionbal.RR_Verner_rate_coef[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
515 ionbal.UTA_ionize_rate[nelem] =
516 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
517 ionbal.UTA_heat_rate[nelem] =
518 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
519 ionbal.ipCompRecoil[nelem] =
520 (
long*)
MALLOC(
sizeof(
long)*(
unsigned)(nelem+1) );
521 ionbal.CompRecoilIonRate[nelem] =
522 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
523 ionbal.CompRecoilIonRateSave[nelem] =
524 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
525 ionbal.CompRecoilHeatRate[nelem] =
526 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
527 ionbal.CompRecoilHeatRateSave[nelem] =
528 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+1) );
529 ionbal.PhotoRate_Shell[nelem] =
530 (
double***)
MALLOC(
sizeof(
double**)*(
unsigned)(nelem+1) );
531 ionbal.CollIonRate_Ground[nelem] =
532 (
double**)
MALLOC(
sizeof(
double*)*(
unsigned)(nelem+1) );
535 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+2) );
537 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)(nelem+2) );
538 mole.xMoleChTrRate[nelem] =
540 for(
long ion=0; ion<nelem+2; ++ion )
542 mole.xMoleChTrRate[nelem][ion] =
545 ionbal.RateRecomIso[nelem] = (
double *)
MALLOC(
sizeof(
double)*(
unsigned)(
NISO) );
546 for(
long ipISO=0; ipISO<
NISO; ++ipISO )
548 ionbal.RateRecomIso[nelem][ipISO] = 0.;
551 for(
long ion=0; ion<nelem+1; ++ion )
554 ionbal.RateRecomTot[nelem][ion] = -1.;
555 ionbal.UTA_ionize_rate[nelem][ion] = -1.;
556 ionbal.UTA_heat_rate[nelem][ion] = -1.;
557 ionbal.ipCompRecoil[nelem][ion] = -99;
558 ionbal.CompRecoilIonRate[nelem][ion] = -1.;
559 ionbal.CompRecoilIonRateSave[nelem][ion] = -1.;
560 ionbal.CompRecoilHeatRate[nelem][ion] = -1.;
561 ionbal.CompRecoilHeatRateSave[nelem][ion] = -1.;
564 ionbal.PhotoRate_Shell[nelem][ion] =
566 ionbal.CollIonRate_Ground[nelem][ion] =
567 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)2 );
568 for(
long ns=0; ns<
NSHELLS; ++ns )
570 ionbal.PhotoRate_Shell[nelem][ion][ns] =
571 (
double*)
MALLOC(
sizeof(
double)*(
unsigned)3 );
575 ionbal.ipCompRecoil[nelem][ion] = -100000;
576 ionbal.DR_Badnell_rate_coef[nelem][ion] = 0.;
577 ionbal.RR_Badnell_rate_coef[nelem][ion] = 0.;
587 for(
long nelem=0; nelem<
LIMELM; ++nelem )
589 for(
long ion=0; ion<nelem+1; ++ion )
592 ionbal.CompRecoilHeatRate[nelem][ion] = 0.;
593 ionbal.CompRecoilIonRate[nelem][ion] = 0.;
594 ionbal.UTA_ionize_rate[nelem][ion] = 0.;
595 ionbal.UTA_heat_rate[nelem][ion] = 0.;
596 ionbal.CollIonRate_Ground[nelem][ion][0] = 0.;
597 ionbal.CollIonRate_Ground[nelem][ion][1] = 0.;
598 ionbal.RateRecomTot[nelem][ion] = 0.;
599 for(
long ns=0; ns <
NSHELLS; ++ns )
603 ionbal.PhotoRate_Shell[nelem][ion][ns][0] = 0.;
604 ionbal.PhotoRate_Shell[nelem][ion][ns][1] = 0.;
605 ionbal.PhotoRate_Shell[nelem][ion][ns][2] = 0.;
609 for(
long ion=0; ion<nelem+2; ++ion )
612 mole.source[nelem][ion] = 0.;
613 mole.sink[nelem][ion] = 0.;
614 for(
long ion2=0; ion2<nelem+2; ++ion2 )
616 mole.xMoleChTrRate[nelem][ion][ion2] = 0.;
621 ionbal.lgPhotoIoniz_On =
true;
622 ionbal.lgCompRecoil =
true;
625 ionbal.lgInnerShellLine_on =
true;
626 ionbal.lgInnerShell_Kisielius =
true;
627 ionbal.lgInnerShell_Gu06 =
true;
630 ionbal.lgSupDie[0] =
true;
631 ionbal.lgSupDie[1] =
false;
634 for(
long nelem = 0; nelem <
LIMELM; ++nelem )
636 ionbal.CotaRate[nelem] = 0.;
643 ionbal.lgGrainIonRecom =
true;
646 ionbal.lgRecom_Badnell_print =
false;
662 dense.SetGasPhaseDensity( nelem, 0. );
663 for(
long ion=0; ion <
LIMELM+1; ion++ )
665 dense.xIonDense[nelem][ion] = 0.;
668 dense.xMassTotal = 0.;
687 conv.PressureErrorAllowed = 0.01f;
689 conv.MaxFractionalDensityStepPerIteration = 0.03;
692 conv.GasPhaseAbundErrorAllowed = 1e-5f;
695 conv.limPres2Ioniz = 3000;
698 conv.nTotalFailures = 0;
708 for(
long i=0; i<74; ++i)
710 input.chTitle[i] =
' ';
712 input.chTitle[75] =
'\0';
728 DoppVel.lgTurb_pressure =
true;
746 pressure.pres_radiation_lines_curr = 0.;
755 pressure.lgSonicPointAbortOK =
true;
781 dense.xNucleiTotal = 1.;
783 dense.xMassDensity0 = -1.0f;
796 dense.HCorrFac = 1.f;
798 dark.lgNFW_Set =
false;
810 opac.lgNegOpacIO =
false;
819 opac.lgOpacStatic =
true;
822 opac.lgOpacNeg =
false;
825 opac.lgScatON =
true;
829 opac.lgCompileOpac =
false;
832 opac.lgUseFileOpac =
false;
839 hextra.lgNeutrnHeatOn =
false;
840 hextra.CrsSecNeutron = 4e-26;
847 hmi.H2_total_f = 0.f;
849 hmi.H2_frac_abund_set = 0.;
851 hmi.h2plus_heat = 0.;
852 hmi.HeatH2Dish_used = 0.;
853 hmi.HeatH2Dexc_used = 0.;
854 hmi.HeatH2Dish_TH85 = 0.;
855 hmi.HeatH2Dexc_TH85 = 0.;
856 hmi.UV_Cont_rel2_Draine_DB96_face = 0.;
857 hmi.UV_Cont_rel2_Draine_DB96_depth = 0.;
858 hmi.UV_Cont_rel2_Habing_TH85_face = 0.;
859 hmi.UV_Cont_rel2_Habing_TH85_depth = 0.;
860 hmi.HeatH2DexcMax = 0.;
861 hmi.CoolH2DexcMax = 0.;
871 hmi.lgLeiden_Keep_ipMH2s =
true;
872 hmi.lgLeidenCRHack =
true;
916 hmi.chH2_small_model_type =
'T';
920 hmi.chH2_small_model_type =
'H';
923 hmi.chH2_small_model_type =
'B';
925 hmi.chH2_small_model_type =
'E';
949 set_NaN(
hmi.H2_Solomon_dissoc_rate_used_H2g );
950 set_NaN(
hmi.H2_Solomon_dissoc_rate_TH85_H2g );
951 set_NaN(
hmi.H2_Solomon_dissoc_rate_BHT90_H2g );
952 set_NaN(
hmi.H2_Solomon_dissoc_rate_BD96_H2g );
953 set_NaN(
hmi.H2_Solomon_dissoc_rate_ELWERT_H2g );
955 set_NaN(
hmi.H2_Solomon_dissoc_rate_used_H2s );
956 set_NaN(
hmi.H2_Solomon_dissoc_rate_TH85_H2s );
957 set_NaN(
hmi.H2_Solomon_dissoc_rate_BHT90_H2s );
958 set_NaN(
hmi.H2_Solomon_dissoc_rate_BD96_H2s );
959 set_NaN(
hmi.H2_Solomon_dissoc_rate_ELWERT_H2s );
973 hmi.chGrainFormPump =
'T';
986 hmi.lgH2_Thermal_BigH2 =
true;
987 hmi.lgH2_Chemistry_BigH2 =
true;
990 for(
long i=0; i <
NCOLD; i++ )
995 colden.coldenH2_ov_vel = 0.;
1001 for(
long i=0; i < 5; i++ )
1007 colden.Si2Colden[i] = 0.;
1009 for(
long i=0; i < 3; i++ )
1020 for(
long i=0; i < 4; i++ )
1037 radius.Radius_mid_zone = 0.;
1040 radius.depth_x_fillfac = 0.;
1041 radius.lgRadiusKnown =
false;
1043 radius.drad_mid_zone = 0.;
1054 radius.CylindHigh = 1e35f;
1057 radius.drad_x_fillfac = 1.;
1058 radius.darea_x_fillfac = 1.;
1063 radius.lgdR2Small =
false;
1066 radius.lgSdrminRel =
false;
1068 radius.lgSdrmaxRel =
false;
1072 radius.sdrmin_rel_depth = 1e-5;
1074 radius.lgDrMinUsed =
false;
1082 rfield.lgKillOTSLine =
false;
1083 rfield.lgKillOutLine =
false;
1084 rfield.lgKillOutCont =
false;
1091 rfield.lgCompileGauntFF =
false;
1094 rfield.lgDoLineTrans =
true;
1098 rfield.lgOpacityReevaluate =
true;
1102 rfield.lgIonizReevaluate =
true;
1107 rfield.fine_opac_nresolv = 1;
1109 rfield.time_continuum_scale = 1.;
1111 rfield.lgSaveOpacityFine =
false;
1116 rfield.lgMustBlockHIon =
false;
1117 rfield.lgBlockHIon =
false;
1159 atmdat.HCharHeatMax = 0.;
1160 atmdat.HCharCoolMax = 0.;
1164 atmdat.CharExcIonTotal[nelem] = 0.;
1165 atmdat.CharExcRecTotal[nelem] = 0.;
1177 for(
long nelem=0; nelem<
LIMELM; ++nelem )
1179 for(
long ion=0; ion<
LIMELM; ++ion )
1181 atmdat.CharExcIonOf[nelem1][nelem][ion] = 0.;
1182 atmdat.CharExcRecTo[nelem1][nelem][ion] = 0.;
1189 atmdat.HCTAlex = 1.92e-9;
1191 for(
long nelem=0; nelem <
LIMELM; nelem++ )
1194 abund.depset[nelem] = 1.;
1196 if(
abund.depset[nelem] == 0. )
1198 fprintf(
ioQQQ,
" ZERO finds insane abundance or depletion.\n" );
1199 fprintf(
ioQQQ,
" atomic number=%6ld abundance=%10.2e depletion=%10.2e\n",
1200 nelem,
abund.solar[nelem],
abund.depset[nelem] );
1210 abund.Depletion[0] = 1.;
1211 abund.Depletion[1] = 1.;
1212 abund.Depletion[2] = .16f;
1213 abund.Depletion[3] = .6f;
1214 abund.Depletion[4] = .13f;
1215 abund.Depletion[5] = 0.4f;
1216 abund.Depletion[6] = 1.0f;
1217 abund.Depletion[7] = 0.6f;
1218 abund.Depletion[8] = .3f;
1219 abund.Depletion[9] = 1.f;
1220 abund.Depletion[10] = 0.2f;
1221 abund.Depletion[11] = 0.2f;
1222 abund.Depletion[12] = 0.01f;
1223 abund.Depletion[13] = 0.03f;
1224 abund.Depletion[14] = .25f;
1225 abund.Depletion[15] = 1.0f;
1226 abund.Depletion[16] = 0.4f;
1227 abund.Depletion[17] = 1.0f;
1228 abund.Depletion[18] = .3f;
1229 abund.Depletion[19] = 1e-4f;
1230 abund.Depletion[20] = 5e-3f;
1231 abund.Depletion[21] = 8e-3f;
1232 abund.Depletion[22] = 6e-3f;
1233 abund.Depletion[23] = 6e-3f;
1234 abund.Depletion[24] = 5e-2f;
1235 abund.Depletion[25] = 0.01f;
1236 abund.Depletion[26] = 0.01f;
1237 abund.Depletion[27] = 0.01f;
1238 abund.Depletion[28] = .1f;
1239 abund.Depletion[29] = .25f;
1241 abund.lgDepln =
false;
1242 abund.ScaleMetals = 1.;
1248 rt.lgMaserCapHit =
false;
1249 rt.lgMaserSetDR =
false;
1253 rt.lgElecScatEscape =
true;
1265 lgFirstCall =
false;