00001
00002
00003
00004 #include "cddefines.h"
00005 #include "grainvar.h"
00006 #include "phycon.h"
00007 #include "input.h"
00008 #include "optimize.h"
00009 #include "parser.h"
00010 #include "grains.h"
00011
00012 void ParseGrain(Parser &p)
00013 {
00014 bool lgC15 = false,
00015 lgC120 = false,
00016 lgLinSet,
00017 lgLogLinSet,
00018 lgQuoteFound,
00019 lgSizeDistribution;
00020 GrainPar gp;
00021
00022
00023 char chFile[FILENAME_PATH_LENGTH_2];
00024 const char *chOption = NULL;
00025
00026 DEBUG_ENTRY( "ParseGrain()" );
00027
00028 p.m_lgDSet = true;
00029
00030
00031 chFile[0] = '\0';
00032
00033
00034 lgQuoteFound = p.nMatch("\"");
00035 if( lgQuoteFound )
00036 {
00037
00038
00039
00040 p.GetQuote( chFile, true );
00041 }
00042
00043 if( p.nMatch("GREY") || p.nMatch("GRAY") || nMatch("grey_", chFile) )
00044 gp.lgGreyGrain = true;
00045 else
00046 gp.lgGreyGrain = false;
00047
00048
00049 if( p.nMatch("FUNC") )
00050 {
00051 if( p.nMatch("SUBL") )
00052 gp.nDustFunc = DF_SUBLIMATION;
00053 else
00054 gp.nDustFunc = DF_USER_FUNCTION;
00055 }
00056 else
00057 gp.nDustFunc = DF_STANDARD;
00058
00059
00060
00061
00062 if( !p.nMatch("SING") )
00063 lgSizeDistribution = true;
00064 else
00065 lgSizeDistribution = false;
00066
00067
00068
00069 gp.lgForbidQHeating = false;
00070
00071 if( p.nMatch("QHEA") )
00072 gp.lgRequestQHeating = true;
00073 else
00074 gp.lgRequestQHeating = false;
00075
00076
00077 if( p.nMatch("NO QH") )
00078 {
00079 gp.lgForbidQHeating = true;
00080 gp.lgRequestQHeating = false;
00081 phycon.lgPhysOK = false;
00082 }
00083
00084
00085
00086
00087 gv.lgReevaluate = !p.nMatch(" NO REEV");
00088
00089
00090 if( p.nMatch("NO HE") )
00091 {
00092 phycon.lgPhysOK = false;
00093 gv.lgDHetOn = false;
00094 }
00095
00096
00097 if( p.nMatch("NO CO") )
00098 {
00099 phycon.lgPhysOK = false;
00100 gv.lgDColOn = false;
00101 }
00102
00103
00104 lgC120 = p.nMatchErase("C120 ");
00105 if (!lgC120)
00106 {
00107 lgC15 = p.nMatchErase("C15 ");
00108 }
00109
00110
00111 lgLogLinSet = false;
00112 lgLinSet = false;
00113 if( p.nMatch(" LOG") )
00114 {
00115 lgLogLinSet = true;
00116 lgLinSet = false;
00117 }
00118 else if( p.nMatch("LINE") )
00119 {
00120 lgLogLinSet = true;
00121 lgLinSet = true;
00122 }
00123
00124
00125
00126 gp.dep = p.FFmtRead();
00127
00128
00129 if( lgLogLinSet )
00130 {
00131
00132 if( lgLinSet )
00133 {
00134
00135 if( gp.dep <= 0. )
00136 {
00137 fprintf( ioQQQ, " Impossible value for linear abundance.\n" );
00138 fprintf( ioQQQ, " Abundance entered was%10.2e\n", gp.dep );
00139 fprintf( ioQQQ, " Sorry.\n" );
00140 cdEXIT(EXIT_FAILURE);
00141 }
00142 }
00143 else
00144 {
00145 gp.dep = pow(10.,gp.dep);
00146 }
00147 }
00148 else
00149 {
00150
00151
00152 if( gp.dep <= 0. )
00153 {
00154 gp.dep = pow(10.,gp.dep);
00155 }
00156 }
00157
00158 if( gp.dep < FLT_MIN )
00159 {
00160 fprintf( ioQQQ, " Grain abundance entered here (%f) is impossible.\n", gp.dep );
00161 cdEXIT(EXIT_FAILURE);
00162 }
00163
00164
00165
00166
00167 if( lgQuoteFound )
00168 {
00169
00170 chOption = "";
00171 mie_read_opc(chFile,gp);
00172 }
00173 else
00174 {
00175 if( p.nMatch("ORIO") )
00176 {
00177
00178
00179
00180
00181
00182 gp.dep *= 0.85;
00183
00184
00185
00186 if( p.nMatch("GRAP") )
00187 {
00188
00189 chOption = "ORION GRAPHITE ";
00190 if( lgSizeDistribution )
00191 {
00192 mie_read_opc("graphite_orion_10.opc",gp);
00193 }
00194 else
00195 {
00196 mie_read_opc("graphite_orion_01.opc",gp);
00197 }
00198 }
00199 else if( p.nMatch("SILI") )
00200 {
00201
00202 chOption = "ORION SILICATE ";
00203 if( lgSizeDistribution )
00204 {
00205 mie_read_opc("silicate_orion_10.opc",gp);
00206 }
00207 else
00208 {
00209 mie_read_opc("silicate_orion_01.opc",gp);
00210 }
00211 }
00212 else
00213 {
00214
00215 chOption = "ORION ";
00216 if( lgSizeDistribution )
00217 {
00218 mie_read_opc("graphite_orion_10.opc",gp);
00219 mie_read_opc("silicate_orion_10.opc",gp);
00220 }
00221 else
00222 {
00223 mie_read_opc("graphite_orion_01.opc",gp);
00224 mie_read_opc("silicate_orion_01.opc",gp);
00225 }
00226 }
00227 }
00228
00229 else if( p.nMatch(" PAH") )
00230 {
00231
00232 if( lgC120 )
00233 {
00234 chOption = "PAH C120 ";
00235 mie_read_opc("pah1_c120.opc",gp);
00236 }
00237
00238 else if( lgC15 )
00239 {
00240 chOption = "PAH C15 ";
00241 mie_read_opc("pah1_c15.opc",gp);
00242 }
00243
00244 else
00245 {
00246
00247
00248 chOption = "PAH ";
00249 if( lgSizeDistribution )
00250 {
00251 mie_read_opc("pah1_ab08_10.opc",gp);
00252 }
00253 else
00254 {
00255 mie_read_opc("pah1_ab08_01.opc",gp);
00256 }
00257 }
00258 }
00259
00260 else if( p.nMatch("GREY") || p.nMatch("GRAY") )
00261 {
00262
00263 chOption = "GREY ";
00264 if( lgSizeDistribution )
00265 {
00266 mie_read_opc("grey_ism_10.opc",gp);
00267 }
00268 else
00269 {
00270 mie_read_opc("grey_ism_01.opc",gp);
00271 }
00272 }
00273
00274 else if( p.nMatch(" ISM") )
00275 {
00276 if( p.nMatch("GRAP") )
00277 {
00278
00279 chOption = "ISM GRAPHITE ";
00280 if( lgSizeDistribution )
00281 {
00282 mie_read_opc("graphite_ism_10.opc",gp);
00283 }
00284 else
00285 {
00286 mie_read_opc("graphite_ism_01.opc",gp);
00287 }
00288 }
00289 else if( p.nMatch("SILI") )
00290 {
00291
00292 chOption = "ISM SILICATE ";
00293 if( lgSizeDistribution )
00294 {
00295 mie_read_opc("silicate_ism_10.opc",gp);
00296 }
00297 else
00298 {
00299 mie_read_opc("silicate_ism_01.opc",gp);
00300 }
00301 }
00302 else
00303 {
00304
00305 chOption = "ISM ";
00306 if( lgSizeDistribution )
00307 {
00308 mie_read_opc("graphite_ism_10.opc",gp);
00309 mie_read_opc("silicate_ism_10.opc",gp);
00310 }
00311 else
00312 {
00313 mie_read_opc("graphite_ism_01.opc",gp);
00314 mie_read_opc("silicate_ism_01.opc",gp);
00315 }
00316 }
00317 }
00318
00319
00320 else
00321 {
00322
00323 chOption = "";
00324 if( lgSizeDistribution )
00325 {
00326 mie_read_opc("graphite_ism_10.opc",gp);
00327 mie_read_opc("silicate_ism_10.opc",gp);
00328 }
00329 else
00330 {
00331 mie_read_opc("graphite_ism_01.opc",gp);
00332 mie_read_opc("silicate_ism_01.opc",gp);
00333 }
00334 }
00335 }
00336
00337
00338 if( optimize.lgVarOn )
00339 {
00340 optimize.nvfpnt[optimize.nparm] = input.nRead;
00341 optimize.vparm[0][optimize.nparm] = (realnum)log10(gp.dep);
00342 optimize.vincr[optimize.nparm] = 1.;
00343
00344
00345 string command( "GRAIN ABUND=%f LOG " );
00346 if( chFile[0] != '\0' )
00347 {
00348 command += "\"";
00349 command += chFile;
00350 command += "\" ";
00351 }
00352
00353
00354
00355 if( chOption == NULL )
00356 TotalInsanity();
00357
00358 command += chOption;
00359
00360
00361
00362
00363 switch( gp.nDustFunc )
00364 {
00365 case DF_STANDARD:
00366
00367 break;
00368 case DF_USER_FUNCTION:
00369 command += "FUNCTION ";
00370 break;
00371 case DF_SUBLIMATION:
00372 command += "FUNCTION SUBLIMATION ";
00373 break;
00374 default:
00375 TotalInsanity();
00376 }
00377
00378 if( !lgSizeDistribution )
00379 command += "SINGLE ";
00380
00381 if( gp.lgForbidQHeating )
00382 command += "NO QHEAT ";
00383 else if( gp.lgRequestQHeating )
00384 command += "QHEAT ";
00385
00386 if( !gv.lgReevaluate )
00387 command += "NO REEVALUATE ";
00388 if( !gv.lgDHetOn )
00389 command += "NO HEATING ";
00390 if( !gv.lgDColOn )
00391 command += "NO COOLING ";
00392
00393 if( command.length() < static_cast<string::size_type>(FILENAME_PATH_LENGTH_2) )
00394 strcpy( optimize.chVarFmt[optimize.nparm], command.c_str() );
00395 else
00396 {
00397 fprintf(ioQQQ," grain command string is too long. This is parse_grain\n");
00398 TotalInsanity();
00399 }
00400
00401 optimize.nvarxt[optimize.nparm] = 1;
00402 ++optimize.nparm;
00403 }
00404 return;
00405 }