87 if( chAssertLimit1 ==
'=' )
89 else if( chAssertLimit1 ==
'<' )
91 else if( chAssertLimit1 ==
'>' )
125 fprintf(
ioQQQ,
" ParseMonitorResults called before InitAsserResults\n" );
189 vector<double> AssertVector;
203 fprintf(
ioQQQ,
"PROBLEM the file %s does not have enough values. sorry\n", chLabel.c_str() );
237 fprintf(
ioQQQ,
" The default monitor error is being changed after"
238 " some asserts were entered. \n This will only affect asserts"
239 " that come after this command.\n");
262 " I could not identify an option on this ASSERT SET XXX command.\n");
269 else if( p.
nMatch(
"IONI" ) )
288 if( (nelem = p.
GetElem()) < 0 )
291 " I could not identify an element name on this line.\n");
305 p.
NoNumb(
"ionization stage");
311 " The ionization stage is inappropriate for this element.\n");
326 p.
NoNumb(
"ionization fraction");
347 " The ionization fraction must be less than one.\n");
356 " The ionization ionization fraction is too small, or zero. Check input\n");
387 else if( p.
nMatch(
" CO " ) )
394 " I could not identify CO or H2 on this line.\n");
406 p.
NoNumb(
"molecular fraction");
428 else if( p.
nMatch(
" LINE " ) )
475 if(0 && b !=
blends.end())
479 else if( chLabel.length() >
NCHLAB-1 )
481 fprintf(
ioQQQ,
" The label must be no more than %d char long, between double quotes.\n",
498 p.
NoNumb(
"intensity/luminosity");
507 " The asserted quantity is a log, but is too large or small, value is %e.\n",
509 fprintf(
ioQQQ,
" I would crash if I tried to use it.\n Sorry.\n" );
518 " The relative intensity must be non-negative, and was %e.\n",
AssertQuantity[nAsserts] );
533 else if( p.
nMatch(
"CASE" ) )
547 if( p.
GetParam(
"FAINT",&Param[nAsserts][4]) )
552 fprintf(
ioQQQ,
" The monitor Case B faint option must have a number,"
553 " the relative intensity of the fainest line to monitor.\n");
557 if( Param[nAsserts][4]<=0. )
567 if( p.
GetRange(
"RANG",&Param[nAsserts][2],&Param[nAsserts][3]) )
572 fprintf(
ioQQQ,
" The monitor Case B range option must have two numbers,"
573 " the lower and upper limit to the wavelengths in Angstroms.\n");
574 fprintf(
ioQQQ,
" There must be a total of three numbers on the line,"
575 " the relative error followed by the lower and upper limits to the "
576 "wavelength in Angstroms.\n");
579 if( Param[nAsserts][2]>Param[nAsserts][3])
597 if( (nelem = p.
GetElem()) < 0 )
600 fprintf(
ioQQQ,
"monitor H-like case B did not find an element on this line, sorry\n");
607 fprintf(
ioQQQ,
"monitor H-like cannot do elements heavier than O, sorry\n");
615 if( p.
nMatch(
"CASE A " ) )
620 else if( p.
nMatch(
"HE-L") )
632 " I could not identify an iso-sequence on this Case A/B command.\n");
639 else if( p.
nMatch(
"DEPA") )
649 for (
long i=chLabel.length();i<
NCHLAB-1;++i)
650 chAssertLineLabel[nAsserts] +=
' ';
656 p.
NoNumb(
"average departure coefficient");
670 else if( p.
nMatch(
"H-LI" ) )
680 " I could not identify an element name on this line.\n");
685 Param[nAsserts][1] = 1.;
691 else if( p.
nMatch(
"HE-L" ) )
701 " I could not identify an element name on this line.\n");
706 Param[nAsserts][1] = 1.;
712 else if( p.
nMatch(
"HMIN" ) )
724 " There must be a second key: H-LIke, HMINus, or HE-Like followed by element.\n");
743 else if( p.
nMatch(
" MAP" ) )
752 else if( p.
nMatch(
"COOL" ) )
759 " There must be a second key, HEATing or COOLing.\n");
785 p.
NoNumb(
"heating/cooling");
805 else if( p.
nMatch(
"COLU" ) )
821 for (
long i=chLabel.length();i<
NCHLAB-1;++i)
868 else if( p.
nMatch(
" CO "))
872 else if( p.
nMatch(
"SIO "))
876 else if( p.
nMatch(
" OH "))
880 else if( p.
nMatch(
" CN ") )
884 else if( p.
nMatch(
" CH ") )
888 else if( p.
nMatch(
" CH+") )
895 " I could not identify H2, H3+, H2+, H2g, H2*, H2H+, CO, O2, SiO, OH, C2 or C3 or on this line.\n");
904 fprintf(
ioQQQ,
" LEVEL option only implemented for H2.\n");
931 p.
NoNumb(
"column density");
969 " I did not find a 2, as in H2, as the first number on this line.\n");
971 " The rate should be the second number.\n");
979 p.
NoNumb(
"grain H2 formation");
1014 p.
NoNumb(
"grain potential");
1029 else if( p.
nMatch(
"TEMP") )
1062 else if( p.
nMatch(
"FACE") )
1070 else if( p.
nMatch(
" H2 ") )
1077 else if( p.
nMatch(
"21CM" ) )
1086 else if( p.
nMatch(
"SPIN" ) )
1090 else if( p.
nMatch(
"OPTI" ) )
1098 " One of MEAN, SPIN, and OPTICAL may be used.\n" );
1106 else if( (nelem = p.
GetElem()) >= 0 )
1116 " I could not identify an element name on this line.\n");
1145 p.
NoNumb(
"ionization stage");
1152 " The ionization stage is inappropriate for this element.\n");
1196 else if( p.
nMatch(
"HHEI") )
1208 p.
NoNumb(
"ionization correction factor");
1224 else if( p.
nMatch(
" H2 ") )
1237 " I could not identify a second keyword on this line.\n");
1244 if( p.
lgEOL() || n2 != 2 )
1246 p.
NoNumb(
"the 2 in H2 ?!");
1263 else if( p.
nMatch(
" MPI") )
1276 else if( p.
nMatch(
"NZON") )
1309 p.
NoNumb(
"pressure error");
1327 else if( p.
nMatch(
"PRADMAX") )
1360 else if( p.
nMatch(
"CSUP") )
1371 p.
NoNumb(
"secondary ionization rate");
1393 else if( p.
nMatch(
"HTOT") )
1405 p.
NoNumb(
"heating rate");
1427 else if( p.
nMatch(
"CTOT") )
1446 p.
NoNumb(
"cooling rate");
1469 else if( p.
nMatch(
"ITRZ") )
1480 p.
NoNumb(
"iterations per zone");
1492 else if( p.
nMatch(
"EDEN") )
1504 p.
NoNumb(
" electron density of the last zone");
1522 else if( p.
nMatch(
" TU ") )
1531 p.
NoNumb(
"energy density of last zone");
1565 p.
NoNumb(
"thickness or depth of model");
1583 else if( p.
nMatch(
"RADI") )
1594 p.
NoNumb(
"outer radius");
1612 else if( p.
nMatch(
"NITE") )
1625 p.
NoNumb(
"number of iterations");
1640 else if( p.
nMatch(
"VELO") )
1651 p.
NoNumb(
"terminal velocity");
1663 else if( p.
nMatch(
"NOTH") )
1675 " Unrecognized command. The line image was\n");
1678 " The options I know about are: ionization, line, departure coefficient, map, column, "
1679 "temperature, nzone, csupre, htot, itrz, eden, thickness, niter, \n");
1689 " ParseMonitorResults: too many asserts, limit is NASSERT=%d\n",
1698 return 1. -
safe_div(pred,assert,1.);
1712 double relint , absint;
1722 long lgDisambiguate =
false;
1764 ipDisambiguate[i][j] = -1;
1775 if( ipDisambiguate[i][0] <= 0 )
1777 fprintf( ioMONITOR,
" monitor error: lgCheckMonitors could not find line ");
1781 " monitor error: The \"save line labels\" command is a good way to get a list of line labels.\n\n");
1784 RelError[i] = 100000.;
1808 if( j==ipDisambiguate[i][0] )
1823 if( strcmp(chCaps,chFind) == 0 )
1825 double relint1, absint1, current_error;
1835 current_error < 2.*fabs(RelError[i]) )
1837 lgDisambiguate =
true;
1840 if( ipDisambiguate[i][1] > 0 )
1842 ipDisambiguate[i][2] = j;
1847 ipDisambiguate[i][1] = j;
1855 PredQuan[i] = relint;
1866 fprintf( ioMONITOR,
" monitor error: lgCheckMonitors could not find line ");
1870 " monitor error: The \"save line labels\" command is a good way to get a list of line labels.\n\n");
1872 RelError[i] = 10000000.;
1880 double relint_cb = 0.,
1884 fprintf( ioMONITOR,
" monitor error: lgCheckMonitors could not find line ");
1888 " monitor error: The \"save line labels\" command is a good way to get a list of line labels.\n\n");
1890 RelError[i] = 10000000.;
1898 PredQuan[i] = absint / absint_cb;
1915 fprintf( ioMONITOR,
" monitor error: lgCheckMonitors could not find line ");
1919 " monitor error: The \"save line labels\" command is a good way to get a list of line labels.\n\n");
1921 RelError[i] = 10000000.;
1928 PredQuan[i] = absint;
1938 double hfrac , hefrac;
1953 " monitor error: lgCheckMonitors could not find h ionization fraction \n");
1973 " monitor error: lgCheckMonitors could not find h ionization fraction \n");
1981 PredQuan[i] = hefrac-hfrac;
1988 PredQuan[i] =
cpu.
i().
lgMPI() ? 1. : 0.;
1996 PredQuan[i] = (double)
nzone;
2046 double sumx=0., sumx2=0., average;
2049 for( n=0; n<
nzone; n++ )
2057 average = sumx/
nzone;
2059 sumx = sqrt( (sumx2-
POW2(sumx)/nzone)/(nzone-1) );
2061 PredQuan[i] = sumx / average;
2069 RelError[i] = PredQuan[i];
2108 (4.*STEFAN_BOLTZ),1,4);
2208 long int nISOCaseB = (long)Param[i][0];
2209 long int nelemCaseB = (long)Param[i][1];
2210 string chElemLabelCaseB =
chIonLbl( nelemCaseB+1, nelemCaseB+1-nISOCaseB );
2227 fprintf(ioMONITOR,
" Species nHi nLo Wl Computed Asserted error\n");
2232 for(
long int ipLo=1+iCase; ipLo<
MIN2(10,nHighestPrinted-1); ++ipLo )
2234 for(
long int ipHi=ipLo+1; ipHi<
MIN2(25,nHighestPrinted); ++ipHi )
2239 if( wl < Param[i][2] || wl > Param[i][3] )
2242 double relint, absint, CBrelint, CBabsint;
2245 if( CBrelint < Param[i][4] )
2249 if(
cdLine( chElemLabelCaseB.c_str(), wl, &relint, &absint,
iLineType[i] ) > 0 )
2252 error = (CBabsint - absint)/
MAX2(CBabsint , absint);
2254 error = (CBabsint - absint);
2255 double RelativeError = fabs(error /
AssertError[i]);
2257 if( RelativeError < 1. )
2259 if( RelativeError < 0.25 )
2261 fprintf( ioMONITOR,
" ChkMonitor ");
2263 else if( RelativeError < 0.50 )
2265 fprintf( ioMONITOR,
" ChkMonitor - ");
2267 else if( RelativeError < 0.75 )
2269 fprintf( ioMONITOR,
" ChkMonitor -- ");
2271 else if( RelativeError < 0.90 )
2273 fprintf( ioMONITOR,
" ChkMonitor --- ");
2275 else if( RelativeError < 0.95 )
2277 fprintf( ioMONITOR,
" ChkMonitor ---- ");
2279 else if( RelativeError < 0.98 )
2281 fprintf( ioMONITOR,
" ChkMonitor ----- ");
2285 fprintf( ioMONITOR,
" ChkMonitor ------ ");
2291 fprintf( ioMONITOR,
" ChkMonitor botch>>");
2293 fprintf(ioMONITOR,
" %s %3li %3li ",
2294 chElemLabelCaseB.c_str() , ipHi , ipLo );
2296 fprintf(ioMONITOR,
" %.2e %.2e %10.3f",
2297 log10(absint) , log10(CBabsint) , error );
2302 fprintf(ioMONITOR ,
" botch \n");
2308 RelError[i] =
MAX2( RelError[i] , fabs(error) );
2322 fprintf(
ioQQQ,
"PROBLEM monitor case B for a He is requested but He is not "
2324 fprintf(
ioQQQ,
"Do not turn off He if you want to monitor its spectrum.\n");
2329 fprintf(ioMONITOR,
" Wl Computed Asserted error\n");
2335 if( wl < Param[i][2] || wl > Param[i][3] )
2337 double relint , absint,CBrelint , CBabsint;
2339 if( CBrelint < Param[i][4] )
2342 if(
cdLine( chElemLabelCaseB.c_str(), wl, &relint, &absint,
iLineType[i] ) > 0)
2345 error = (CBabsint - absint)/
MAX2(CBabsint , absint);
2347 error = (CBabsint - absint);
2348 double RelativeError = fabs(error /
AssertError[i]);
2350 if( RelativeError < 1. )
2352 if( RelativeError < 0.25 )
2354 fprintf( ioMONITOR,
" ChkMonitor ");
2356 else if( RelativeError < 0.50 )
2358 fprintf( ioMONITOR,
" ChkMonitor - ");
2360 else if( RelativeError < 0.75 )
2362 fprintf( ioMONITOR,
" ChkMonitor -- ");
2364 else if( RelativeError < 0.90 )
2366 fprintf( ioMONITOR,
" ChkMonitor --- ");
2368 else if( RelativeError < 0.95 )
2370 fprintf( ioMONITOR,
" ChkMonitor ---- ");
2372 else if( RelativeError < 0.98 )
2374 fprintf( ioMONITOR,
" ChkMonitor ----- ");
2378 fprintf( ioMONITOR,
" ChkMonitor ------ ");
2384 fprintf( ioMONITOR,
" ChkMonitor botch>>");
2387 fprintf(ioMONITOR,
" %.2e %.2e %10.3f",
2388 absint , CBabsint , error );
2393 fprintf(ioMONITOR ,
" botch \n");
2399 RelError[i] =
MAX2( RelError[i] , fabs(error) );
2415 if( this_species.find(
'[' ) == string::npos )
2419 this_species +=
"[2:]";
2421 this_species +=
"[:]";
2424 vector<long> speciesLevels;
2428 fprintf(
ioQQQ,
"PROBLEM Could not find species between quotes: \"%s\".\n",
2435 fprintf(
ioQQQ,
"WARNING Species '%s' has no internal structure."
2436 " Cannot compute departure coefficient\n",
2442 else if( speciesLevels.size() > 0 )
2448 long numPrintLevels = 0;
2449 for( vector<long>::const_iterator ilvl = speciesLevels.begin(); ilvl != speciesLevels.end(); ilvl++ )
2457 ASSERT( numPrintLevels > 0 );
2458 PredQuan[i] /= (double)(numPrintLevels);
2462 if( 0 &&
fp_equal( Param[i][1], 1. ) && PredQuan[i]==0. )
2473 fprintf(
ioQQQ,
"WARNING Requested level(s) in '%s' do not exist\n",
2485 long ipISO = (long)Param[i][0];
2489 fprintf(
ioQQQ,
"PROBLEM asserted element %ld is not turned on!\n",nelem);
2500 PredQuan[i] +=
iso_sp[ipISO][nelem].
st[n].DepartCoef();
2502 ASSERT( numPrintLevels > 0 );
2503 PredQuan[i] /= (double)(numPrintLevels);
2506 if(
fp_equal( Param[i][1], 1. ) && PredQuan[i]==0. )
2530 strcpy( chWeight ,
"VOLUME" );
2535 strcpy( chWeight ,
"RADIUS" );
2551 " monitor error: lgCheckMonitors could not find a line with label %s %f \n",
2561 PredQuan[i] = relint;
2576 if( (relint =
cdH2_colden( (
long)Param[i][0] , (
long)Param[i][1] ) ) < 0. )
2578 fprintf(
ioQQQ,
" PROBLEM lgCheckMonitors did not find v=%li, J=%li for H2 column density.\n",
2579 (
long)Param[i][0] , (
long)Param[i][1] );
2600 " monitor error: lgCheckMonitors could not find a molecule with label %s %f \n",
2611 PredQuan[i] = relint;
2636 " monitor error: lgCheckMonitors could not find a molecule with label %s %f \n",
2645 PredQuan[i] = relint;
2661 " monitor error: lgCheckMonitors cannot check map since map not done.\n");
2672 " monitor error: lgCheckMonitors cannot check map since temperature not within range.\n");
2714 strcpy( chWeight ,
"VOLUME" );
2719 strcpy( chWeight ,
"RADIUS" );
2729 if( nd >=
gv.
bin.size() )
2732 fprintf(
ioQQQ,
"Use 1 for first grain that is turned on, " );
2734 fprintf(
ioQQQ,
"Old style grain numbers are not valid anymore !!\n" );
2764 " monitor error: lgCheckMonitors could not find an ion with label %s ion %li \n",
2775 PredQuan[i] = relint;
2788 if( nd >=
gv.
bin.size() )
2791 fprintf(
ioQQQ,
"Use 1 for first grain that is turned on, " );
2793 fprintf(
ioQQQ,
"Old style grain numbers are not valid anymore !!\n" );
2806 " monitor error: lgCheckMonitors received an insane chAssertType=%s, impossible\n",
2828 if( RelError[i] <= 0. )
2838 if( RelError[i] >= 0. )
2852 if( lgDisambiguate )
2856 double relint1, relint2, absint1;
2860 fprintf( ioMONITOR,
"=============Line Disambiguation=======================================================\n" );
2861 fprintf( ioMONITOR,
" Wavelengths || Intensities \n" );
2862 fprintf( ioMONITOR,
"Label line match1 match2 match3 || asserted match1 match2 match3\n" );
2866 if( ipDisambiguate[i][1] > 0 )
2875 if( ipDisambiguate[i][2] > 0 )
2882 fprintf( ioMONITOR ,
"--------" );
2891 fprintf( ioMONITOR ,
" %10.3e %10.3e %10.3e %10.3e\n",
2899 fprintf( ioMONITOR ,
" %10.4f %10.4f %10.4f %10.4f\n",
2923 fprintf(ioMONITOR,
"%s", ctime(&now) );
2932 fprintf( ioMONITOR,
" No errors were found. Summary follows.\n");
2936 fprintf( ioMONITOR,
" Errors were found. Summary follows.\n");
2940 " %-*s%*s computed asserted Rel Err Set err type \n",
2956 fprintf( ioMONITOR,
" BIG BOTCHED MONITORS!!! Big Botched Monitors!!! \n");
2960 fprintf( ioMONITOR,
" BOTCHED MONITORS!!! Botched Monitors!!! \n");
2965 fprintf(ioMONITOR,
"\n The mean of the %li monitor Case A, B relative "
2966 "residuals is %.2f\n\n" ,
2989 fprintf( ioMONITOR,
" intr " );
2992 fprintf( ioMONITOR,
" emer " );
2995 fprintf( ioMONITOR,
" intr cumu" );
2998 fprintf( ioMONITOR,
" emer cumu" );
3001 fprintf( ioMONITOR,
"ERROR: Unrecognized line type: %d\n",
3014 double prtPredQuan, prtAssertQuantity;
3027 prtPredQuan = PredQuan;
3036 double relative = fabs( RelError /
SDIV( fabs(AssertError)));
3038 if( relative < 0.25 || chAssertLimit !=
'=' )
3040 fprintf( ioMONITOR,
" ChkMonitor ");
3042 else if( relative < 0.50 )
3044 fprintf( ioMONITOR,
" ChkMonitor - ");
3046 else if( relative < 0.75 )
3048 fprintf( ioMONITOR,
" ChkMonitor -- ");
3050 else if( relative < 0.90 )
3052 fprintf( ioMONITOR,
" ChkMonitor --- ");
3054 else if( relative < 0.95 )
3056 fprintf( ioMONITOR,
" ChkMonitor ---- ");
3058 else if( relative < 0.98 )
3060 fprintf( ioMONITOR,
" ChkMonitor ----- ");
3064 fprintf( ioMONITOR,
" ChkMonitor ------ ");
3069 fprintf( ioMONITOR,
" ChkMonitor botch>>");
3072 fprintf( ioMONITOR ,
"%-*s ",
NCHLAB-1, chAssertLineLabel.c_str() );
3075 if( strcmp( chAssertType,
"Ll" )==0 || strcmp( chAssertType,
"Lr" )==0 ||
3076 strcmp( chAssertType,
"Lb" )==0 )
3078 prt_wl( ioMONITOR , wavelength );
3085 const char* format =
" %10.4f %c %10.4f %7.3f %7.3f ";
3087 format =
" %10.3e %c %10.3e %7.3f %7.3f ";
3104 if( !lg1OK && (fabs(RelError) > 3.*AssertError) && lgFound )
3107 if( fabs(RelError) > 9.*AssertError )
3108 fprintf( ioMONITOR ,
" <<BIG BIG (>9sig) BOTCH!!\n");
3110 fprintf( ioMONITOR ,
" <<BIG (3sig) BOTCH!!\n");
bool nMatch(const char *chKey) const
void cdLine_ip(long int ipLine, double *relint, double *absint)
realnum WaveLengthCaseB[8][25][24]
void prt_wl(FILE *ioOUT, realnum wl)
static bool lgSpaceAllocated
void InitMonitorResults(void)
string chIonLbl(const TransitionProxy &t)
realnum WavlenErrorGet(realnum wavelength, long sig_figs)
double ForcePass(char chAssertLimit1)
static vector< bool > lgQuantityLog
map< std::string, std::vector< TransitionProxy > >::iterator blend_iterator
NORETURN void TotalInsanity(void)
double get_error_ratio(double pred, double assert)
t_monitorresults MonitorResults
long int nSumErrorCaseMonitor
void ParseMonitorResults(Parser &p)
int cdIonFrac(const char *chLabel, long int IonStage, double *fracin, const char *chWeight, bool lgDensity)
long int nTotalIoniz_start
int GetQuote(string &chLabel)
static vector< char > chAssertLimit
bool nMatchErase(const char *chKey)
int cdTemp(const char *chLabel, long int IonStage, double *TeMean, const char *chWeight)
double DepartCoef() const
static realnum ErrorDefaultPerformance
static multi_arr< double, 2 > Param
void cap4(char *chCAP, const char *chLab)
static vector< string > strAssertSpecies
void trimTrailingWhiteSpace(string &str)
NORETURN void StringError() const
static t_version & Inst()
t_elementnames elementnames
t_iso_sp iso_sp[NISO][LIMELM]
void prt_line_err(FILE *ioOUT, const char *label, realnum wvlng)
double xIonDense[LIMELM][LIMELM+1]
bool fp_equal(sys_float x, sys_float y, int n=3)
double SumErrorCaseMonitor
double cdH2_colden(long iVib, long iRot)
long int n_HighestResolved_max
static vector< double > AssertError
static vector< double > AssertQuantity
STATIC void prtLineType(FILE *ioMONITOR, const int iLineType)
const molezone * getLevelsGeneric(const char *chLabel, bool lgValidate, vector< long > &LevelList)
NORETURN void NoNumb(const char *chDesc) const
static realnum ErrorDefault
long int GetElem(void) const
diatomics h2("h2", 4100.,&hmi.H2_total, Yan_H2_CS)
static vector< std::vector< TransitionProxy > * > assertBlends
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
char chElementNameShort[LIMELM][CHARS_ELEMENT_NAME_SHORT]
static vector< string > chAssertLineLabel
enum level_status status() const
void PrtOneMonitor(FILE *ioMONITOR, const char *chAssertType, const string chAssertLineLabel, const realnum wavelength, const int iLineType, const double PredQuan, const char chAssertLimit, const double AssertQuantity, const double RelError, const double AssertError, const bool lg1OK, const bool lgQuantityLog, const bool lgFound)
long int cdLine(const char *chLabel, realnum wavelength, double *relint, double *absint)
void reserve(size_type i1)
int cdColm(const char *chLabel, long int ion, double *theocl)
bool GetParam(const char *chKey, double *val)
#define DEBUG_ENTRY(funcname)
double powpq(double x, int p, int q)
static vector< realnum > wavelength
static vector< double > AssertQuantity2
bool lgCheckMonitors(FILE *ioMONITOR)
int fprintf(const Output &stream, const char *format,...)
map< std::string, std::vector< TransitionProxy > > blends
sys_float SDIV(sys_float x)
vector< realnum > CaseBWlHeI
int PrintLine(FILE *fp) const
static const int NASSERTS
static const long sig_figs_max
t_secondaries secondaries
static vector< int > iLineType
bool GetRange(const char *chKey, double *val1, double *val2)
static char ** chAssertType
double rate_h2_form_grains_used_total