00001 
00002 
00003 
00004 #include "cddefines.h"
00005 #include "optimize.h"
00006 #include "input.h"
00007 #include "elementnames.h"
00008 #include "abund.h"
00009 
00010 void abund_starburst(char *chCard)
00011 {
00012         bool lgDebug, 
00013           lgEOL;
00014         long int i, 
00015           j;
00016         double sqrzed, 
00017           zHigh, 
00018           zal, 
00019           zar, 
00020           zc, 
00021           zca, 
00022           zcl, 
00023           zco, 
00024           zed, 
00025           zed2, 
00026           zed3, 
00027           zed4, 
00028           zedlog, 
00029           zfe, 
00030           zh, 
00031           zhe, 
00032           zmg, 
00033           zn, 
00034           zna, 
00035           zne, 
00036           zni, 
00037           zo, 
00038           zs, 
00039           zsi;
00040         
00041         static double zLimit = 35.5;
00042 
00043         DEBUG_ENTRY( "abund_starburst()" );
00044 
00045 
00046         if( nMatch("TRAC",chCard) )
00047         {
00048                 lgDebug = true;
00049         }
00050         else
00051         {
00052                 lgDebug = false;
00053         }
00054 
00055         i = 5;
00056         
00057         zed = FFmtRead(chCard,&i,INPUT_LINE_LENGTH,&lgEOL);
00058         if( lgDebug )
00059         {
00060                 
00061 
00062                 zHigh = zLimit;
00063 
00064                 
00065                 fprintf( ioQQQ, " Abundances relative to H, Z\n" );
00066 
00067                 
00068                 fprintf( ioQQQ, "     Z   ");
00069 
00070                 
00071                 for(j=0; j < 30; j++)
00072                 {
00073                         fprintf( ioQQQ, "    %2.2s", elementnames.chElementSym[j]);
00074                 }
00075                 fprintf( ioQQQ, "    \n" );
00076 
00077                 zed = 1e-3;
00078         }
00079         else if( lgEOL && !lgDebug )
00080         {
00081                 
00082                 fprintf( ioQQQ, " The metallicity must appear on this line.\n" );
00083                 cdEXIT(EXIT_FAILURE);
00084         }
00085         else
00086         {
00087                 zHigh = zed;
00088         }
00089 
00090         
00091 
00092         if( nMatch(" LOG",chCard) )
00093         {
00094                 zed = pow(10.,zed);
00095                 zHigh = zed;
00096         }
00097 
00098         else if( nMatch("LINE",chCard) )
00099         {
00100                 if( zed <= 0. )
00101                 {
00102                         fprintf( ioQQQ, " Z .le.0 not allowed, Z=%10.2e\n", 
00103                           zed );
00104                         cdEXIT(EXIT_FAILURE);
00105                 }
00106         }
00107 
00108         else
00109         {
00110                 
00111                 if( zed <= 0. )
00112                 {
00113                         zed = pow(10.,zed);
00114                         zHigh = zed;
00115                 }
00116         }
00117 
00118         
00119 
00120 
00121 
00122         while( zed <= zHigh )
00123         {
00124                 if( zed < 1e-3 || zed > zLimit )
00125                 {
00126                         fprintf( ioQQQ, " The metallicity must be between 1E-3 and%10.2e\n", 
00127                           zLimit );
00128                         cdEXIT(EXIT_FAILURE);
00129                 }
00130                 zed2 = zed*zed;
00131                 zed3 = zed2*zed;
00132                 zed4 = zed3*zed;
00133                 zedlog = log(zed);
00134                 sqrzed = sqrt(zed);
00135                 
00136                 zh = 1.081646723 - 0.04600492*zed + 8.6569e-6*zed2 + 1.922e-5*
00137                   zed3 - 2.0087e-7*zed4;
00138 
00139                 
00140                 zhe = 0.864675891 + 0.044423807*zed + 7.10886e-5*zed2 - 5.3242e-5*
00141                   zed3 + 5.70194e-7*zed4;
00142                 abund.solar[1] = (realnum)zhe;
00143 
00144                 
00145                 abund.solar[2] = 1.;
00146                 abund.solar[3] = 1.;
00147                 abund.solar[4] = 1.;
00148 
00149                 
00150                 zc = 0.347489799 + 0.016054107*zed - 0.00185855*zed2 + 5.43015e-5*
00151                   zed3 - 5.3123e-7*zed4;
00152                 abund.solar[5] = (realnum)zc;
00153 
00154                 
00155                 zn = -0.06549567 + 0.332073984*zed + 0.009146066*zed2 - 0.00054441*
00156                   zed3 + 6.16363e-6*zed4;
00157                 if( zn < 0.0 )
00158                 {
00159                         zn = 0.05193*zed;
00160                 }
00161                 if( zed < 0.3 )
00162                 {
00163                         zn = -0.00044731103 + 0.00026453554*zed + 0.52354843*zed2 - 
00164                           0.41156655*zed3 + 0.1290967*zed4;
00165                         if( zn < 0.0 )
00166                         {
00167                                 zn = 0.000344828*zed;
00168                         }
00169                 }
00170                 abund.solar[6] = (realnum)zn;
00171 
00172                 
00173                 zo = 1.450212747 - 0.05379041*zed + 0.000498919*zed2 + 1.09646e-5*
00174                   zed3 - 1.8147e-7*zed4;
00175                 abund.solar[7] = (realnum)zo;
00176 
00177                 
00178                 zne = 1.110139023 + 0.002551998*zed - 2.09516e-7*zed3 - 0.00798157*
00179                   POW2(zedlog);
00180                 abund.solar[9] = (realnum)zne;
00181 
00182                 
00183                 abund.solar[8] = abund.solar[9];
00184 
00185                 
00186                 zna = 1.072721387 - 0.02391599*POW2(zedlog) + .068644972*
00187                   zedlog + 0.017030935/sqrzed;
00188                 
00189                 zna = MAX2(1e-12,zna);
00190                 abund.solar[10] = (realnum)zna;
00191 
00192                 
00193                 zmg = 1.147209646 - 7.9491e-7*POW3(zed) - .00264458*POW2(zedlog) - 
00194                   0.00635552*zedlog;
00195                 abund.solar[11] = (realnum)zmg;
00196 
00197                 
00198                 zal = 1.068116358 - 0.00520227*sqrzed*zedlog - 0.01403851*
00199                   POW2(zedlog) + 0.066186787*zedlog;
00200                 
00201                 zal = MAX2(1e-12,zal);
00202                 abund.solar[12] = (realnum)zal;
00203 
00204                 
00205                 zsi = 1.067372578 + 0.011818743*zed - 0.00107725*zed2 + 3.66056e-5*
00206                   zed3 - 3.556e-7*zed4;
00207                 abund.solar[13] = (realnum)zsi;
00208 
00209                 
00210                 abund.solar[14] = abund.solar[13];
00211 
00212                 
00213                 zs = 1.12000;
00214                 abund.solar[15] = (realnum)zs;
00215 
00216                 
00217                 zcl = 1.10000;
00218                 abund.solar[16] = (realnum)zcl;
00219 
00220                 
00221                 zar = 1.091067724 + 2.51124e-6*zed3 - 0.0039589*sqrzed*zedlog + 
00222                   0.015686715*zedlog;
00223                 abund.solar[17] = (realnum)zar;
00224 
00225                 
00226                 abund.solar[18] = abund.solar[13];
00227 
00228                 
00229                 zca = 1.077553875 - 0.00888806*zed + 0.001479866*zed2 - 6.5689e-5*
00230                   zed3 + 1.16935e-6*zed4;
00231                 abund.solar[19] = (realnum)zca;
00232 
00233                 
00234                 zfe = 0.223713045 + 0.001400746*zed + 0.000624734*zed2 - 3.5629e-5*
00235                   zed3 + 8.13184e-7*zed4;
00236                 abund.solar[25] = (realnum)zfe;
00237 
00238                 
00239                 abund.solar[20] = abund.solar[25];
00240 
00241                 
00242                 abund.solar[21] = abund.solar[25];
00243 
00244                 
00245                 abund.solar[22] = abund.solar[25];
00246 
00247                 
00248                 abund.solar[23] = abund.solar[25];
00249 
00250                 
00251                 abund.solar[24] = abund.solar[25];
00252 
00253                 
00254                 zco = zfe;
00255                 abund.solar[26] = (realnum)zco;
00256 
00257                 
00258                 zni = zfe;
00259                 abund.solar[27] = (realnum)zni;
00260 
00261                 
00262                 abund.solar[28] = abund.solar[25];
00263 
00264                 
00265                 abund.solar[29] = abund.solar[25];
00266 
00267                 
00268                 abund.solar[0] = 1.;
00269                 abund.solar[1] = (realnum)(abund.solar[1]*abund.SolarSave[1]/
00270                   zh);
00271 
00272                 for( i=2; i < LIMELM; i++ )
00273                 {
00274                         abund.solar[i] = (realnum)(abund.solar[i]*abund.SolarSave[i]*
00275                           zed/zh);
00276                 }
00277 
00278                 if( lgDebug )
00279                 {
00280                         fprintf( ioQQQ, "%10.2e", zed );
00281                         for( i=0; i < LIMELM; i++ )
00282                         {
00283                                 fprintf( ioQQQ, "%6.2f", log10(abund.solar[i]) );
00284                         }
00285                         fprintf( ioQQQ, "\n" );
00286 
00287                         if( fp_equal( zed, zLimit ) )
00288                         {
00289                                 cdEXIT(EXIT_FAILURE);
00290                         }
00291                 }
00292 
00293                 
00294                 if( zed < zLimit )
00295                 {
00296                         zed = MIN2(zed*1.5,zLimit);
00297                 }
00298                 else
00299                 {
00300                         zed *= 1.5;
00301                 }
00302         }
00303 
00304         
00305         if( optimize.lgVarOn )
00306         {
00307                 
00308                 optimize.nvarxt[optimize.nparm] = 1;
00309                 strcpy( optimize.chVarFmt[optimize.nparm], "ABUNDANCES STARBURST %f LOG" );
00310                 
00311                 optimize.varang[optimize.nparm][0] = (realnum)log10(1e-3);
00312                 optimize.varang[optimize.nparm][1] = (realnum)log10(zLimit);
00313                 
00314                 optimize.nvfpnt[optimize.nparm] = input.nRead;
00315                 
00316                 optimize.vparm[0][optimize.nparm] = (realnum)log10(zed);
00317                 optimize.vincr[optimize.nparm] = 0.2f;
00318                 ++optimize.nparm;
00319         }
00320         return;
00321 }