00001
00002
00003
00004 #include "cddefines.h"
00005 #include "grains.h"
00006 #include "grainvar.h"
00007 #include "abund.h"
00008 #include "phycon.h"
00009 #include "called.h"
00010 #include "elementnames.h"
00011 #include "input.h"
00012 #include "parser.h"
00013
00014 void ParseAbundances(Parser &p)
00015
00016
00017 {
00018 bool lgLog;
00019 long int i;
00020 double absav[LIMELM],
00021 chk;
00022 GrainPar gp;
00023
00024 DEBUG_ENTRY( "ParseAbundances()" );
00025
00026 if( p.nMatch("STAR") )
00027 {
00028
00029 abund_starburst(p);
00030 return;
00031 }
00032
00033 absav[0] = p.FFmtRead();
00034
00035 if( !p.lgEOL() )
00036 {
00037 absav[1] = p.FFmtRead();
00038 if( p.lgEOL() )
00039 {
00040
00041
00042 if( p.nMatch(" ALL") )
00043 {
00044
00045 if( absav[0] <= 0. )
00046 {
00047 absav[0] = pow(10.,absav[0]);
00048 }
00049 for( i=1; i < LIMELM; i++ )
00050 {
00051 abund.solar[i] = (realnum)absav[0];
00052 }
00053
00054 }
00055 else if( p.nMatch("OLD ") && p.nMatch("SOLA") )
00056 {
00057 i = (int)absav[0];
00058
00059 if( i!=84 )
00060 {
00061 fprintf( ioQQQ,
00062 " The only old abundance set I have is for version 84 - %3ld was requested. Sorry.\n",
00063 i );
00064 cdEXIT(EXIT_FAILURE);
00065 }
00066 for( i=1; i < LIMELM; i++ )
00067 {
00068
00069 abund.SolarSave[i] = abund.OldSolar84[i];
00070 abund.solar[i] = abund.OldSolar84[i];
00071 }
00072 }
00073 else if( p.nMatch("GASS10"))
00074 {
00075
00076
00077 for( i=1; i < LIMELM; i++ )
00078 {
00079
00080 abund.SolarSave[i] = abund.GASS10[i];
00081 abund.solar[i] = abund.GASS10[i];
00082 }
00083 }
00084 else
00085 {
00086 fprintf( ioQQQ,
00087 " I did not recognize a sub-keyword - options are ALL, OLD SOLAR 84, and GASS10. Sorry.\n");
00088 cdEXIT(EXIT_FAILURE);
00089 }
00090
00091
00092 return;
00093 }
00094
00095
00096 for( i=2; i < abund.npSolar; i++ )
00097 {
00098 absav[i] = p.FFmtRead();
00099 if( p.lgEOL() )
00100 {
00101
00102 do
00103 {
00104 p.getline();
00105 if( p.m_lgEOF )
00106 {
00107 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00108 abund.npSolar, i );
00109 cdEXIT(EXIT_FAILURE);
00110 }
00111 } while( p.isComment() );
00112
00113 p.echo();
00114
00115 if( p.strcmp("CONT") != 0 )
00116 {
00117 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00118 abund.npSolar, i );
00119 cdEXIT(EXIT_FAILURE);
00120 }
00121 else
00122 {
00123 absav[i] = p.FFmtRead();
00124 if( p.lgEOL() )
00125 {
00126 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00127 abund.npSolar, i);
00128 cdEXIT(EXIT_FAILURE);
00129 }
00130 }
00131 }
00132 }
00133
00134
00135
00136
00137 chk = p.FFmtRead();
00138 if( !p.lgEOL() || (chk!=0.) )
00139 {
00140
00141 fprintf( ioQQQ, " There were more than %ld abundances entered\n",
00142 abund.npSolar );
00143 fprintf( ioQQQ, " Could there have been a typo somewhere?\n" );
00144 }
00145
00146
00147 lgLog = false;
00148 for( i=0; i < abund.npSolar; i++ )
00149 if( absav[i] < 0. )
00150 lgLog = true;
00151
00152 if( lgLog )
00153 {
00154
00155 for( i=0; i < abund.npSolar; i++ )
00156 abund.solar[abund.ipSolar[i]-1] = (realnum)pow(10.,absav[i]);
00157 }
00158 else
00159 {
00160
00161 for( i=0; i < abund.npSolar; i++ )
00162 abund.solar[abund.ipSolar[i]-1] *= (realnum)absav[i];
00163 }
00164
00165
00166 for( i=1; i < LIMELM; i++ )
00167 {
00168 if( abund.solar[i] > 0.2 )
00169 {
00170 fprintf( ioQQQ, " Is an abundance of %.3e relative to H reasonable for %2.2s?\n",
00171 abund.solar[i], elementnames.chElementSym[i] );
00172 }
00173 }
00174 return;
00175 }
00176
00177
00178
00179 if( p.nMatch(" AGB") || p.nMatch("AGB ") || p.nMatch("PLAN") )
00180 {
00181
00182
00183 if( !p.nMatch("NO GR") )
00184 {
00185
00186 if( !p.m_lgDSet )
00187 {
00188
00189 gv.clear();
00190
00191 gp.dep = 1.;
00192
00193 gp.nDustFunc = DF_STANDARD;
00194 gp.lgRequestQHeating = true;
00195 gp.lgForbidQHeating = false;
00196 gp.lgGreyGrain = false;
00197
00198
00199 if( p.nMatch("NO QH") )
00200 {
00201 gp.lgForbidQHeating = true;
00202 gp.lgRequestQHeating = false;
00203 phycon.lgPhysOK = false;
00204 }
00205
00206
00207 mie_read_opc("graphite_ism_10.opc",gp);
00208 mie_read_opc("silicate_ism_10.opc",gp);
00209 }
00210 }
00211
00212 for( i=0; i < LIMELM; i++ )
00213 {
00214 abund.solar[i] = abund.apn[i];
00215 if( !abund.lgElmONapn[i] )
00216 {
00217
00218
00219 char chDUMMY[INPUT_LINE_LENGTH];
00220 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00221 p.setline(chDUMMY);
00222 ParseElement( p );
00223 }
00224 }
00225 }
00226
00227 else if( p.nMatch("CAME") )
00228 {
00229
00230
00231 for( i=0; i < LIMELM; i++ )
00232 abund.solar[i] = abund.camern[i];
00233 }
00234
00235 else if( p.nMatch("CRAB") )
00236 {
00237
00238 for( i=0; i < LIMELM; i++ )
00239 {
00240 abund.solar[i] = abund.aCrab[i];
00241 if( !abund.lgElmONaCrab[i] )
00242 {
00243
00244
00245 char chDUMMY[INPUT_LINE_LENGTH];
00246 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00247 p.setline(chDUMMY);
00248 ParseElement( p );
00249 }
00250 }
00251 }
00252 else if( p.nMatch("HII ") || p.nMatch("H II") || p.nMatch("ORIO") )
00253 {
00254
00255
00256 if( !p.nMatch("NO GR") )
00257 {
00258
00259 if( !p.m_lgDSet )
00260 {
00261
00262 gv.clear();
00263
00264 gp.dep = 1.;
00265
00266 gp.nDustFunc = DF_STANDARD;
00267 gp.lgRequestQHeating = true;
00268 gp.lgForbidQHeating = false;
00269 gp.lgGreyGrain = false;
00270
00271
00272 if( p.nMatch("NO QH") )
00273 {
00274 gp.lgForbidQHeating = true;
00275 gp.lgRequestQHeating = false;
00276 phycon.lgPhysOK = false;
00277 }
00278
00279
00280
00281
00282
00283 gp.dep *= 0.85;
00284
00285 mie_read_opc("graphite_orion_10.opc",gp);
00286 mie_read_opc("silicate_orion_10.opc",gp);
00287 }
00288 }
00289
00290 for( i=0; i < LIMELM; i++ )
00291 {
00292 abund.solar[i] = abund.ahii[i];
00293 if( !abund.lgElmONahii[i] )
00294 {
00295
00296
00297 char chDUMMY[INPUT_LINE_LENGTH];
00298 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00299 p.setline(chDUMMY);
00300 ParseElement( p );
00301 }
00302 }
00303 }
00304
00305 else if( p.nMatch("ISM ") || p.nMatch(" ISM") )
00306 {
00307
00308
00309 if( !p.nMatch("NO GR") )
00310 {
00311 if( !p.m_lgDSet )
00312 {
00313
00314 gv.clear();
00315
00316 gp.dep = 1.;
00317
00318 gp.nDustFunc = DF_STANDARD;
00319 gp.lgRequestQHeating = true;
00320 gp.lgForbidQHeating = false;
00321 gp.lgGreyGrain = false;
00322
00323
00324 if( p.nMatch("NO QH") )
00325 {
00326 gp.lgForbidQHeating = true;
00327 gp.lgRequestQHeating = false;
00328 phycon.lgPhysOK = false;
00329 }
00330
00331
00332 mie_read_opc("graphite_ism_10.opc",gp);
00333 mie_read_opc("silicate_ism_10.opc",gp);
00334 }
00335 }
00336
00337 for( i=0; i < LIMELM; i++ )
00338 {
00339 abund.solar[i] = abund.aism[i];
00340 if( !abund.lgElmONaism[i] )
00341 {
00342
00343
00344 char chDUMMY[INPUT_LINE_LENGTH];
00345 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00346 p.setline(chDUMMY);
00347 ParseElement( p );
00348 }
00349 }
00350 }
00351
00352 else if( p.nMatch("NOVA") )
00353 {
00354
00355 for( i=0; i < LIMELM; i++ )
00356 abund.solar[i] = abund.anova[i];
00357 }
00358
00359 else if( p.nMatch("PRIM") )
00360 {
00361
00362 for( i=0; i < 4; i++ )
00363 {
00364 abund.solar[i] = abund.aprim[i];
00365 }
00366
00367
00368 for( i=4; i < LIMELM; i++ )
00369 {
00370
00371
00372 char chDUMMY[INPUT_LINE_LENGTH];
00373 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00374 p.setline(chDUMMY);
00375 ParseElement( p );
00376 }
00377 }
00378
00379 else
00380 {
00381 fprintf( ioQQQ,
00382 " ABUNDances must have PLAN, H II, CAMERON, CRAB, NOVA, ALL, STARBURST, OLD SOLAR 84 or PRIMORDIAL. Sorry.\n" );
00383 cdEXIT(EXIT_FAILURE);
00384 }
00385 return;
00386 }