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
00074 else
00075 {
00076 fprintf( ioQQQ,
00077 " I did not recognize a sub-keyword - options are ALL and OLD SOLAR 84. Sorry.\n");
00078 cdEXIT(EXIT_FAILURE);
00079 }
00080
00081
00082 return;
00083 }
00084
00085
00086 for( i=2; i < abund.npSolar; i++ )
00087 {
00088 absav[i] = p.FFmtRead();
00089 if( p.lgEOL() )
00090 {
00091
00092 do
00093 {
00094 p.getline();
00095 if( p.m_lgEOF )
00096 {
00097 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00098 abund.npSolar, i );
00099 cdEXIT(EXIT_FAILURE);
00100 }
00101 } while( p.isComment() );
00102
00103 p.echo();
00104
00105 if( p.strcmp("CONT") != 0 )
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 else
00112 {
00113 absav[i] = p.FFmtRead();
00114 if( p.lgEOL() )
00115 {
00116 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00117 abund.npSolar, i);
00118 cdEXIT(EXIT_FAILURE);
00119 }
00120 }
00121 }
00122 }
00123
00124
00125
00126
00127 chk = p.FFmtRead();
00128 if( !p.lgEOL() || (chk!=0.) )
00129 {
00130
00131 fprintf( ioQQQ, " There were more than %ld abundances entered\n",
00132 abund.npSolar );
00133 fprintf( ioQQQ, " Could there have been a typo somewhere?\n" );
00134 }
00135
00136
00137 lgLog = false;
00138 for( i=0; i < abund.npSolar; i++ )
00139 if( absav[i] < 0. )
00140 lgLog = true;
00141
00142 if( lgLog )
00143 {
00144
00145 for( i=0; i < abund.npSolar; i++ )
00146 abund.solar[abund.ipSolar[i]-1] = (realnum)pow(10.,absav[i]);
00147 }
00148 else
00149 {
00150
00151 for( i=0; i < abund.npSolar; i++ )
00152 abund.solar[abund.ipSolar[i]-1] *= (realnum)absav[i];
00153 }
00154
00155
00156 for( i=1; i < LIMELM; i++ )
00157 {
00158 if( abund.solar[i] > 0.2 )
00159 {
00160 fprintf( ioQQQ, " Is an abundance of %.3e relative to H reasonable for %2.2s?\n",
00161 abund.solar[i], elementnames.chElementSym[i] );
00162 }
00163 }
00164 return;
00165 }
00166
00167
00168
00169 if( p.nMatch(" AGB") || p.nMatch("AGB ") || p.nMatch("PLAN") )
00170 {
00171
00172
00173 if( !p.nMatch("NO GR") )
00174 {
00175
00176 if( !p.m_lgDSet )
00177 {
00178
00179 gv.clear();
00180
00181 gp.dep = 1.;
00182
00183 gp.nDustFunc = DF_STANDARD;
00184 gp.lgRequestQHeating = true;
00185 gp.lgForbidQHeating = false;
00186 gp.lgGreyGrain = false;
00187
00188
00189 if( p.nMatch("NO QH") )
00190 {
00191 gp.lgForbidQHeating = true;
00192 gp.lgRequestQHeating = false;
00193 phycon.lgPhysOK = false;
00194 }
00195
00196
00197 mie_read_opc("graphite_ism_10.opc",gp);
00198 mie_read_opc("silicate_ism_10.opc",gp);
00199 }
00200 }
00201
00202 for( i=0; i < LIMELM; i++ )
00203 {
00204 abund.solar[i] = abund.apn[i];
00205 if( !abund.lgElmONapn[i] )
00206 {
00207
00208
00209 char chDUMMY[INPUT_LINE_LENGTH];
00210 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00211 p.setline(chDUMMY);
00212 ParseElement( p );
00213 }
00214 }
00215 }
00216
00217 else if( p.nMatch("CAME") )
00218 {
00219
00220
00221 for( i=0; i < LIMELM; i++ )
00222 abund.solar[i] = abund.camern[i];
00223 }
00224
00225 else if( p.nMatch("CRAB") )
00226 {
00227
00228 for( i=0; i < LIMELM; i++ )
00229 {
00230 abund.solar[i] = abund.aCrab[i];
00231 if( !abund.lgElmONaCrab[i] )
00232 {
00233
00234
00235 char chDUMMY[INPUT_LINE_LENGTH];
00236 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00237 p.setline(chDUMMY);
00238 ParseElement( p );
00239 }
00240 }
00241 }
00242 else if( p.nMatch("HII ") || p.nMatch("H II") || p.nMatch("ORIO") )
00243 {
00244
00245
00246 if( !p.nMatch("NO GR") )
00247 {
00248
00249 if( !p.m_lgDSet )
00250 {
00251
00252 gv.clear();
00253
00254 gp.dep = 1.;
00255
00256 gp.nDustFunc = DF_STANDARD;
00257 gp.lgRequestQHeating = true;
00258 gp.lgForbidQHeating = false;
00259 gp.lgGreyGrain = false;
00260
00261
00262 if( p.nMatch("NO QH") )
00263 {
00264 gp.lgForbidQHeating = true;
00265 gp.lgRequestQHeating = false;
00266 phycon.lgPhysOK = false;
00267 }
00268
00269
00270
00271
00272
00273 gp.dep *= 0.85;
00274
00275 mie_read_opc("graphite_orion_10.opc",gp);
00276 mie_read_opc("silicate_orion_10.opc",gp);
00277 }
00278 }
00279
00280 for( i=0; i < LIMELM; i++ )
00281 {
00282 abund.solar[i] = abund.ahii[i];
00283 if( !abund.lgElmONahii[i] )
00284 {
00285
00286
00287 char chDUMMY[INPUT_LINE_LENGTH];
00288 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00289 p.setline(chDUMMY);
00290 ParseElement( p );
00291 }
00292 }
00293 }
00294
00295 else if( p.nMatch("ISM ") || p.nMatch(" ISM") )
00296 {
00297
00298
00299 if( !p.nMatch("NO GR") )
00300 {
00301 if( !p.m_lgDSet )
00302 {
00303
00304 gv.clear();
00305
00306 gp.dep = 1.;
00307
00308 gp.nDustFunc = DF_STANDARD;
00309 gp.lgRequestQHeating = true;
00310 gp.lgForbidQHeating = false;
00311 gp.lgGreyGrain = false;
00312
00313
00314 if( p.nMatch("NO QH") )
00315 {
00316 gp.lgForbidQHeating = true;
00317 gp.lgRequestQHeating = false;
00318 phycon.lgPhysOK = false;
00319 }
00320
00321
00322 mie_read_opc("graphite_ism_10.opc",gp);
00323 mie_read_opc("silicate_ism_10.opc",gp);
00324 }
00325 }
00326
00327 for( i=0; i < LIMELM; i++ )
00328 {
00329 abund.solar[i] = abund.aism[i];
00330 if( !abund.lgElmONaism[i] )
00331 {
00332
00333
00334 char chDUMMY[INPUT_LINE_LENGTH];
00335 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00336 p.setline(chDUMMY);
00337 ParseElement( p );
00338 }
00339 }
00340 }
00341
00342 else if( p.nMatch("NOVA") )
00343 {
00344
00345 for( i=0; i < LIMELM; i++ )
00346 abund.solar[i] = abund.anova[i];
00347 }
00348
00349 else if( p.nMatch("PRIM") )
00350 {
00351
00352 for( i=0; i < 4; i++ )
00353 {
00354 abund.solar[i] = abund.aprim[i];
00355 }
00356
00357
00358 for( i=4; i < LIMELM; i++ )
00359 {
00360
00361
00362 char chDUMMY[INPUT_LINE_LENGTH];
00363 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00364 p.setline(chDUMMY);
00365 ParseElement( p );
00366 }
00367 }
00368
00369 else
00370 {
00371 fprintf( ioQQQ,
00372 " ABUNDances must have PLAN, H II, CAMERON, CRAB, NOVA, ALL, STARBURST, OLD SOLAR 84 or PRIMORDIAL. Sorry.\n" );
00373 cdEXIT(EXIT_FAILURE);
00374 }
00375 return;
00376 }