00001
00002
00003 #include "cddefines.h"
00004 #include "hmi.h"
00005 #include "trace.h"
00006 #include "grainvar.h"
00007 #include "rfield.h"
00008 #include "mole.h"
00009 #include "dense.h"
00010 #include "taulines.h"
00011 #include "iso.h"
00012 #include "deuterium.h"
00013
00014
00015
00016
00017
00018 int eden_sum(void)
00019 {
00020 DEBUG_ENTRY( "eden_sum()" );
00021
00022 if( dense.EdenSet > 0.f )
00023 {
00024
00025 dense.EdenTrue = dense.EdenSet;
00026 dense.eden_from_metals = 1.;
00027
00028 if( trace.lgTrace || trace.lgESOURCE )
00029 fprintf( ioQQQ, " eden_sum zn: %.2f eden set to: %.4e\n", fnzone, dense.EdenSet );
00030 }
00031 else if( dense.EdenFraction > 0.f )
00032 {
00033
00034 dense.EdenTrue = dense.EdenFraction*dense.gas_phase[ipHYDROGEN];
00035 dense.eden_from_metals = 1.;
00036
00037 if( trace.lgTrace || trace.lgESOURCE )
00038 {
00039 fprintf( ioQQQ, " eden_sum zn: %.2f eden ratio set to: %.4e, eden is: %.4e\n",
00040 fnzone, dense.EdenFraction, dense.EdenTrue );
00041 }
00042 }
00043 else
00044 {
00045
00046 dense.EdenTrue = dense.EdenExtra;
00047
00048
00049 double eden_ions[LIMELM];
00050 double sum_all_ions = 0.;
00051 double sum_metals = 0.;
00052 for( long nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
00053 {
00054 eden_ions[nelem] = 0.;
00055 for( long ion=1; ion <= nelem+1; ion++ )
00056 eden_ions[nelem] += ion*dense.xIonDense[nelem][ion];
00057
00058 sum_all_ions += eden_ions[nelem];
00059 if( nelem >= ipLITHIUM )
00060 sum_metals += eden_ions[nelem];
00061 }
00062 sum_all_ions += deut.xIonDense[1];
00063 dense.EdenTrue += sum_all_ions;
00064
00065
00066
00067
00068 mole.elec = 0.;
00069 for( long i=0; i < mole_global.num_calc; i++ )
00070 {
00071 if( mole_global.list[i]->parentLabel.empty() && (!mole_global.list[i]->isMonatomic() || mole_global.list[i]->charge < 0) )
00072 mole.elec += mole.species[i].den*mole_global.list[i]->charge;
00073 }
00074
00075 dense.EdenTrue += mole.elec;
00076
00077
00078
00079 dense.EdenTrue += gv.TotalEden*gv.lgGrainElectrons;
00080
00081
00082 dense.eden_from_metals = safe_div( sum_metals, dense.EdenTrue, 1. );
00083
00084 if( trace.lgTrace || trace.lgESOURCE )
00085 {
00086 fprintf( ioQQQ,
00087 " eden_sum zn: %.2f current: %.4e new true: %.4e ions: %.4e mole: %.4e"
00088 " grain: %.4e extra: %.4e LaOTS: %.4e\n",
00089 fnzone ,
00090 dense.eden ,
00091 dense.EdenTrue ,
00092 sum_all_ions ,
00093 mole.elec ,
00094 gv.TotalEden*gv.lgGrainElectrons,
00095 dense.EdenExtra ,
00096 rfield.otslin[iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).ipCont()-1] );
00097
00098 if( trace.lgNeBug )
00099 {
00100 for( long nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
00101 {
00102 if( nelem == 0 )
00103 fprintf( ioQQQ, " eden_sum H -Ne:" );
00104 else if( nelem == 10 )
00105 fprintf( ioQQQ, " eden_sum Na-Ca:" );
00106 else if( nelem == 20 )
00107 fprintf( ioQQQ, " eden_sum Sc-Zn:" );
00108 fprintf( ioQQQ, " %.4e", eden_ions[nelem] );
00109 if( nelem%10 == 9 )
00110 fprintf( ioQQQ, "\n" );
00111 }
00112 }
00113 }
00114 }
00115
00116
00117 ASSERT( dense.EdenSet <= 0.f || fp_equal((realnum)dense.EdenTrue, dense.EdenSet) );
00118
00119 return 0;
00120 }