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 }