00001 
00002 
00003 
00004 
00005 
00006 #include "cddefines.h"
00007 #include "hmi.h"
00008 #include "trace.h"
00009 #include "grainvar.h"
00010 #include "rfield.h"
00011 #include "mole.h"
00012 #include "dense.h"
00013 #include "conv.h"
00014 
00015 
00016 
00017 
00018 int eden_sum(void)
00019 {
00020         long int i,
00021           ion, 
00022           nelem;
00023 
00024         realnum sum_all_ions ,
00025                 sum_metals ,
00026                 hmole_eden,
00027                 eden_ions[LIMELM];
00028 
00029         DEBUG_ENTRY( "eden_sum()" );
00030 
00031         
00032         dense.EdenTrue = dense.EdenExtra;
00033 
00034         
00035         sum_all_ions = 0.;
00036         sum_metals = 0.;
00037         for( nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
00038         {
00039                 if( nelem==ipLITHIUM )
00040                         sum_metals = 0.;
00041                 eden_ions[nelem] = dense.xIonDense[nelem][1];
00042                 
00043 
00044                 
00045 
00046                 for( ion=2; ion <= nelem+1; ion++ )
00047                 {
00048                         
00049                         eden_ions[nelem] += ion*dense.xIonDense[nelem][ion];
00050                 }
00051 
00052                 sum_all_ions += eden_ions[nelem];
00053                 sum_metals += eden_ions[nelem];
00054         }
00055         dense.EdenTrue += sum_all_ions;
00056         ASSERT( dense.EdenTrue >= 0. );
00057 
00058         
00059         co.comole_eden = 0.;
00060         for( i=0; i < mole.num_comole_calc; i++ )
00061         {
00062                 if(COmole[i]->n_nuclei != 1)
00063                 {
00064                         co.comole_eden += COmole[i]->hevmol*COmole[i]->nElec;
00065                 }
00066         }
00067 
00068         
00069         dense.EdenTrue += co.comole_eden;
00070         ASSERT( dense.EdenTrue >= 0. );
00071 
00072         
00073         hmole_eden = 0.;
00074         for(i=0;i<N_H_MOLEC;i++)
00075         {
00076                 
00077                 hmole_eden += hmi.Hmolec[i]*hmi.nElectron[i];
00078         }
00079         
00080 
00081         
00082         
00083 
00084         if( (-hmole_eden) > dense.EdenTrue/4. && conv.lgSearch )
00085         {
00086                 
00087                 dense.EdenTrue *= 0.9;
00088         }
00089         else if( (-hmole_eden) > dense.EdenTrue )
00090         {
00091                 
00092 
00093 
00094                 fprintf(ioQQQ," PROBLEM sum eden from hmole too neg, set to  limt.  EdenTrue:%.3e hmole_eden:%.3e \n",
00095                         dense.EdenTrue, 
00096                         hmole_eden);
00097                 dense.EdenTrue = dense.EdenTrue/2.;
00098         }
00099         else
00100         {
00101                 
00102                 dense.EdenTrue += hmole_eden;
00103         }
00104         ASSERT(dense.EdenTrue >= 0. );
00105 
00106         
00107 
00108         if( dense.EdenSet > 0. )
00109         {
00110                 dense.EdenTrue = dense.EdenSet;
00111                 dense.eden_from_metals = 1.;
00112         }
00113         else
00114         {
00115                 
00116                 
00117                 dense.eden_from_metals = sum_metals / SDIV(dense.EdenTrue);
00118                 
00119         }
00120         
00121 
00122         
00123         
00124 
00125 
00126 
00127         
00128         if( dense.EdenTrue+gv.TotalEden*gv.lgGrainElectrons >= 0. )
00129         {
00130                 
00131 
00132                 dense.EdenTrue += gv.TotalEden*gv.lgGrainElectrons;
00133         }
00134         else
00135         {
00136                 
00137                 if( !conv.lgSearch )
00138                         fprintf(ioQQQ,
00139                         " PROBLEM eden grain neg limt %.2f eden %.4e new eden bef grn %.4e"
00140                         "grain eden %.4e  set edentrue to %.4e Search?%c\n",
00141                         fnzone,
00142                         dense.eden, 
00143                         dense.EdenTrue, 
00144                         gv.TotalEden,
00145                         dense.eden*0.9,
00146                         TorF(conv.lgSearch));
00147 
00148                 
00149                 dense.EdenTrue += gv.TotalEden*gv.lgGrainElectrons;
00150         }
00151 
00152         if( trace.lgTrace || trace.lgESOURCE )
00153         {
00154                 fprintf( ioQQQ, 
00155                         "     eden_sum zn:%.2f current:%.4e new true:%.4e ions:%.4e comole:%.4e hmole:%.4e grain:%.4e extra:%.4e sum:%.4e LaOTS:%.4e\n",
00156                   fnzone ,
00157                   dense.eden , 
00158                   dense.EdenTrue , 
00159                   sum_all_ions ,
00160                   co.comole_eden ,
00161                   hmole_eden ,
00162                   gv.TotalEden*gv.lgGrainElectrons,
00163                   dense.EdenExtra ,
00164                   sum_all_ions + co.comole_eden + hmole_eden + gv.TotalEden*gv.lgGrainElectrons + dense.EdenExtra,
00165                   rfield.otslin[2182] );
00166 
00167                 if( trace.lgNeBug )
00168                 {
00169                         for(nelem=ipHYDROGEN; nelem < LIMELM; nelem++)
00170                         {
00171                                 if( nelem==0 )
00172                                 {
00173                                         fprintf( ioQQQ, "      eden_sum H -Ne:" );
00174                                 }
00175                                 else if( nelem==10 )
00176                                 {
00177                                         fprintf( ioQQQ, "\n      eden_sum Na-Ca:" );
00178                                 }
00179                                 else if( nelem==20 )
00180                                 {
00181                                         fprintf( ioQQQ, "\n      eden_sum Sc-Zn:" );
00182                                 }
00183                                 fprintf( ioQQQ, " %.4e", eden_ions[nelem] );
00184                                 if( nelem==29 )
00185                                 {
00186                                         fprintf( ioQQQ, "\n" );
00187                                 }
00188                                 
00189 
00190                         }
00191                 }
00192         }
00193 
00194         
00195         
00196         if( 0 && dense.EdenTrue < 0. )
00197         {
00198                 fprintf( ioQQQ, "eden_sum finds non-positive electron density.\n" );
00199                 fprintf( ioQQQ, 
00200                         "     eden_sum: EdenTrue to%12.4e fm%12.4e Ne(H):%10.2e Ne(He):%10.2e Ne(C):\n", 
00201                   dense.EdenTrue, 
00202                   dense.eden, 
00203                   dense.xIonDense[ipHYDROGEN][1], 
00204                   dense.xIonDense[ipHELIUM][1] + 2.*dense.xIonDense[ipHELIUM][2] );
00205                 ShowMe();
00206                 cdEXIT(EXIT_FAILURE);
00207         }
00208         else if( dense.EdenTrue == 0. )
00209         {
00210                 fprintf( ioQQQ, "\nDISASTER PROBLEM eden_sum finds an electron density of zero, this is unphysical.\n" );
00211                 fprintf( ioQQQ, "There appears to be no source of ionization.\n");
00212                 fprintf( ioQQQ, "Consider adding background cosmic rays with COSMIC RAY BACKGROUND and BACKGROUND commands.\n\n");
00213                 lgAbort = true;
00214 
00215                 return 1;
00216         }
00217 
00218         {
00219                 
00220                 enum {DEBUG_LOC=false};
00221                 
00222                 if( DEBUG_LOC )
00223                 {
00224                         fprintf(ioQQQ,"esumdebugg\t%li\t%.2e\t%.2e\n",
00225                                 nzone,
00226                           dense.eden, dense.EdenTrue);
00227                 }
00228         }
00229 
00230         
00231         dense.eden = MAX2( SMALLFLOAT , dense.eden );
00232 
00233         return 0;
00234 }