00001
00002
00003
00004 #include "cddefines.h"
00005 #include "grains.h"
00006 #include "abund.h"
00007 #include "phycon.h"
00008 #include "called.h"
00009 #include "elementnames.h"
00010 #include "input.h"
00011 #include "parse.h"
00012
00013 void ParseAbundances(char *chCard,
00014
00015
00016 bool lgDSet)
00017 {
00018 bool lgEOF,
00019 lgEOL,
00020 lgLog;
00021 long int i,
00022 j,
00023 k;
00024 double absav[LIMELM],
00025 chk;
00026 GrainPar gp;
00027
00028 DEBUG_ENTRY( "ParseAbundances()" );
00029
00030 j = 5;
00031 absav[0] = FFmtRead(chCard,&j,INPUT_LINE_LENGTH,&lgEOL);
00032
00033
00034
00035 if( !lgEOL )
00036 {
00037 absav[1] = FFmtRead(chCard,&j,INPUT_LINE_LENGTH,&lgEOL);
00038 if( lgEOL )
00039 {
00040
00041
00042 if( nMatch(" ALL",chCard) )
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( nMatch("OLD ",chCard) && nMatch("SOLA",chCard) )
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 if( nMatch("STAR",chCard) )
00075 {
00076
00077 abund_starburst(chCard);
00078 }
00079 else
00080 {
00081 fprintf( ioQQQ,
00082 " I did not recognize a sub-keyword - options are ALL and OLD SOLAR 84. Sorry.\n");
00083 cdEXIT(EXIT_FAILURE);
00084 }
00085
00086
00087 return;
00088 }
00089
00090
00091 for( i=2; i < abund.npSolar; i++ )
00092 {
00093 absav[i] = FFmtRead(chCard,&j,INPUT_LINE_LENGTH,&lgEOL);
00094 if( lgEOL )
00095 {
00096
00097 input_readarray(chCard,&lgEOF);
00098 if( lgEOF )
00099 {
00100 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00101 abund.npSolar, i );
00102 cdEXIT(EXIT_FAILURE);
00103 }
00104
00105
00106 while( lgInputComment(chCard) )
00107 {
00108 if( lgEOF )
00109 {
00110 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00111 abund.npSolar, i );
00112 cdEXIT(EXIT_FAILURE);
00113 }
00114
00115 input_readarray(chCard,&lgEOF);
00116 }
00117
00118
00119 if( called.lgTalk )
00120 {
00121 fprintf( ioQQQ, " * ");
00122 k=0;
00123 while( chCard[k]!='\0' )
00124 {
00125 fprintf(ioQQQ,"%c",chCard[k]);
00126 ++k;
00127 }
00128 while( k<80 )
00129 {
00130 fprintf(ioQQQ,"%c",' ');
00131 ++k;
00132 }
00133 fprintf( ioQQQ,"*\n");
00134 }
00135
00136
00137 caps(chCard);
00138 if( strncmp(chCard,"CONT",4) != 0 )
00139 {
00140 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00141 abund.npSolar, i );
00142 cdEXIT(EXIT_FAILURE);
00143 }
00144 else
00145 {
00146 j = 1;
00147 absav[i] = FFmtRead(chCard,&j,INPUT_LINE_LENGTH,&lgEOL);
00148 if( lgEOF )
00149 {
00150 fprintf( ioQQQ, " There MUST be%3ld abundances entered, there were only%3ld. Sorry.\n",
00151 abund.npSolar, i);
00152 cdEXIT(EXIT_FAILURE);
00153 }
00154 }
00155 }
00156 }
00157
00158
00159
00160
00161 chk = FFmtRead(chCard,&j,INPUT_LINE_LENGTH,&lgEOL);
00162 if( !lgEOL || (chk!=0.) )
00163 {
00164
00165 fprintf( ioQQQ, " There were more than %ld abundances entered\n",
00166 abund.npSolar );
00167 fprintf( ioQQQ, " Could there have been a typo somewhere?\n" );
00168 }
00169
00170
00171 lgLog = false;
00172 for( i=0; i < abund.npSolar; i++ )
00173 {
00174 if( absav[i] < 0. )
00175 lgLog = true;
00176 }
00177
00178 if( lgLog )
00179 {
00180
00181 for( i=0; i < abund.npSolar; i++ )
00182 {
00183 abund.solar[abund.ipSolar[i]-1] = (realnum)pow(10.,absav[i]);
00184 }
00185 }
00186 else
00187 {
00188
00189 for( i=0; i < abund.npSolar; i++ )
00190 {
00191 abund.solar[abund.ipSolar[i]-1] *= (realnum)absav[i];
00192 }
00193 }
00194
00195
00196 if( abund.solar[1] > 0.2 )
00197 {
00198 fprintf( ioQQQ, " Is an abundance of%10.3e for %2.2s reasonable?\n",
00199 abund.solar[1], elementnames.chElementSym[1] );
00200 }
00201
00202 for( i=2; i < LIMELM; i++ )
00203 {
00204 if( abund.solar[i] > 0.1 )
00205 {
00206 fprintf( ioQQQ, " Is an abundance of%10.3e for %2.2s reasonable?\n",
00207 abund.solar[i], elementnames.chElementSym[i] );
00208 }
00209 }
00210 return;
00211 }
00212
00213
00214
00215 if( nMatch(" AGB",chCard) || nMatch("AGB ",chCard) || nMatch("PLAN",chCard) )
00216 {
00217
00218
00219 if( !nMatch("O GR",chCard) )
00220 {
00221
00222 if( !lgDSet )
00223 {
00224
00225 ReturnGrainBins();
00226
00227 gp.dep = 1.;
00228 gp.lgAbunVsDepth = false;
00229 gp.lgRequestQHeating = true;
00230 gp.lgForbidQHeating = false;
00231 gp.lgGreyGrain = false;
00232
00233
00234 if( nMatch("O QH",chCard) )
00235 {
00236 gp.lgForbidQHeating = true;
00237 gp.lgRequestQHeating = false;
00238 phycon.lgPhysOK = false;
00239 }
00240
00241
00242 mie_read_opc("graphite_ism_10.opc",gp);
00243 mie_read_opc("silicate_ism_10.opc",gp);
00244 }
00245 }
00246
00247 for( i=0; i < LIMELM; i++ )
00248 {
00249 abund.solar[i] = abund.apn[i];
00250 }
00251 }
00252
00253 else if( nMatch("HII ",chCard) || nMatch("H II",chCard) || nMatch("ORIO",chCard) )
00254 {
00255
00256
00257 if( !nMatch("O GR",chCard) )
00258 {
00259
00260 if( !lgDSet )
00261 {
00262
00263 ReturnGrainBins();
00264
00265 gp.dep = 1.;
00266 gp.lgAbunVsDepth = false;
00267 gp.lgRequestQHeating = true;
00268 gp.lgForbidQHeating = false;
00269 gp.lgGreyGrain = false;
00270
00271
00272 if( nMatch("O QH",chCard) )
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 }
00294 }
00295
00296 else if( nMatch("ISM ",chCard) || nMatch(" ISM",chCard) )
00297 {
00298
00299
00300 if( !nMatch("O GR",chCard) )
00301 {
00302 if( !lgDSet )
00303 {
00304
00305 ReturnGrainBins();
00306
00307 gp.dep = 1.;
00308 gp.lgAbunVsDepth = false;
00309 gp.lgRequestQHeating = true;
00310 gp.lgForbidQHeating = false;
00311 gp.lgGreyGrain = false;
00312
00313
00314 if( nMatch("O QH",chCard) )
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 }
00331 }
00332
00333 else if( nMatch("NOVA",chCard) )
00334 {
00335
00336 for( i=0; i < LIMELM; i++ )
00337 {
00338 abund.solar[i] = abund.anova[i];
00339 }
00340 }
00341
00342 else if( nMatch("PRIM",chCard) )
00343 {
00344
00345 for( i=0; i < LIMELM; i++ )
00346 {
00347 abund.solar[i] = abund.aprim[i];
00348 }
00349
00350
00351 for( i=4; i < LIMELM; i++ )
00352 {
00353
00354
00355 char chDUMMY[LIMELM];
00356 sprintf(chDUMMY,"element %s off ", elementnames.chElementName[i] );
00357
00358 caps(chDUMMY);
00359 ParseElement( chDUMMY );
00360 }
00361 }
00362
00363 else if( nMatch("CAME",chCard) )
00364 {
00365
00366 for( i=0; i < LIMELM; i++ )
00367 {
00368 abund.solar[i] = abund.camern[i];
00369 }
00370 }
00371
00372 else
00373 {
00374 fprintf( ioQQQ,
00375 " ABUND must have PLAN, H II, CAMERON, NOVA, ALL, STARBURST, OLD SOLAR 84 or PRIMORDIAL. Sorry.\n" );
00376 cdEXIT(EXIT_FAILURE);
00377 }
00378 return;
00379 }