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