00001
00002
00003
00004 #include "cddefines.h"
00005 #include "trace.h"
00006 #include "dense.h"
00007 #include "sil.h"
00008 #include "ionbal.h"
00009
00010 void IonSilic(void)
00011 {
00012 const int NDIM = ipSILICON+1;
00013
00014 static const double dicoef[2][NDIM] = {
00015 {1.10e-3,5.87e-3,5.03e-3,5.43e-3,8.86e-3,1.68e-2,2.49e-2,3.13e-2,
00016 4.25e-2,6.18e-2,1.38e-2,.327,.189,0.},
00017 {0.,.753,.188,.450,0.,1.80,1.88,2.01,1.22,.303,1.42,.306,.286,0.}
00018 };
00019 static const double dite[2][NDIM] = {
00020 {7.70e4,9.63e4,8.75e4,1.05e6,1.14e6,4.85e5,4.15e5,3.66e5,3.63e5,
00021 3.88e5,2.51e5,1.88e7,1.99e7,0.},
00022 {0.,6.46e4,4.71e4,7.98e5,0.,1.03e6,1.91e6,2.11e6,2.14e6,1.12e6,
00023 3.93e6,3.60e6,4.14e6,0.}
00024 };
00025 static const double ditcrt[NDIM] = {1.1e4,1.1e4,1.1e4,1.7e5,9.5e4,8.0e4,
00026 7.4e4,6.8e4,6.6e4,6.5e4,4.5e4,3.7e6,6.3e6,1e20};
00027 static const double aa[NDIM] = {-0.0219,3.2163,0.1203,0.,0.,0.,0.,0.,
00028 0.,0.,0.,0.,0.,0.};
00029 static const double bb[NDIM] = {0.4364,-12.0571,-2.6900,0.,0.,0.,0.,
00030 0.,0.,0.,0.,0.,0.,0.};
00031 static const double cc[NDIM] = {0.0684,16.2118,19.1943,0.,0.,0.,0.,
00032 0.,0.,0.,0.,0.,0.,0.};
00033 static const double dd[NDIM] = {-0.0032,-0.5886,-0.1479,0.,0.,0.,0.,
00034 0.,0.,0.,0.,0.,0.,0.};
00035 static const double ff[NDIM] = {0.1342,0.5613,0.1118,0.1,0.,0.,0.,0.,
00036 0.,0.,0.,0.,0.,0.};
00037
00038 bool lgPrtDebug=false;
00039 static long nzUsed = -1;
00040 static double OldRate = 0.;
00041 double save_rec;
00042
00043 DEBUG_ENTRY( "IonSilic()" );
00044
00045
00046 if( !dense.lgElmtOn[ipSILICON] )
00047 {
00048 sil.p1895 = 0.;
00049
00050 DEBUG_EXIT( "IonSilic()" );
00051 return;
00052 }
00053
00054 ion_zero(ipSILICON);
00055
00056 ion_photo(ipSILICON,false);
00057 if( nzone > 1 && OldRate > 0. )
00058 {
00059 if( nzone != nzUsed )
00060 {
00061 ionbal.PhotoRate_Shell[ipSILICON][0][4][0] =
00062 (ionbal.PhotoRate_Shell[ipSILICON][0][4][0] + OldRate)/2.;
00063 nzUsed = nzone;
00064 }
00065 else
00066 {
00067 ionbal.PhotoRate_Shell[ipSILICON][0][4][0] = OldRate;
00068 }
00069 }
00070 OldRate = ionbal.PhotoRate_Shell[ipSILICON][0][4][0];
00071
00072
00073 ion_collis(ipSILICON);
00074
00075
00076
00077
00078 ion_recomb(false,(const double*)dicoef,(const double*)dite,ditcrt,aa,bb,cc,dd,ff,ipSILICON);
00079
00080
00081
00082
00083 sil.p1895 = ionbal.PhotoRate_Shell[ipSILICON][1][2][0];
00084
00085
00086
00087
00088
00089 save_rec = ionbal.RateRecomTot[ipSILICON][0];
00090
00091
00092
00093
00094 # if 0
00095 if( dense.IonLow[ipSILICON]==0 &&
00096 co.hevmol[ipSIP] > SMALLFLOAT &&
00097 ionbal.RateIonizTot[ipSILICON][0]*co.hevmol[ipATSI]>0.)
00098 {
00099
00100
00101 ionbal.RateRecomTot[ipSILICON][0] =
00102 ionbal.RateIonizTot[ipSILICON][0]*
00103 co.hevmol[ipATSI]/co.hevmol[ipSIP];
00104
00105
00106
00107
00108
00109 }
00110 # endif
00111
00112
00113
00114 ion_solver(ipSILICON,lgPrtDebug);
00115
00116
00117 if( save_rec > 0. )
00118 ionbal.RateRecomTot[ipSILICON][0] = save_rec;
00119
00120
00121 sil.p1895 *= dense.xIonDense[ipSILICON][1]*0.85;
00122
00123 if( trace.lgTrace && trace.lgHeavyBug )
00124 {
00125 fprintf( ioQQQ, " silicon\t%.2f",fnzone );
00126 for( int i=0; i <= 10; i++ )
00127 {
00128 fprintf( ioQQQ, "\t%.3e", dense.xIonDense[ipSILICON][i]);
00129 }
00130 fprintf( ioQQQ, "\n" );
00131 }
00132 # if 0
00133 fprintf( ioQQQ, "DEBUG silicon\t%.2f",fnzone );
00134 for( i=0; i < 2; i++ )
00135 {
00136 fprintf( ioQQQ, "\t%.3e", dense.xIonDense[ipSILICON][i]/dense.gas_phase[ipSILICON]);
00137 }
00138 fprintf( ioQQQ, "\t%.3e", co.hevmol[ipATSI]/SDIV(co.hevmol[ipSIP]));
00139 fprintf( ioQQQ, "\t%.3e", ionbal.RateIonizTot[ipSILICON][0]);
00140 fprintf( ioQQQ, "\t%.3e", dense.gas_phase[ipHYDROGEN] );
00141 {
00142 # include "grainvar.h"
00143 fprintf( ioQQQ, "\t%.3e", gv.GrainChTrRate[ipSILICON][1][0] );
00144 }
00145 fprintf( ioQQQ, "\n" );
00146 # endif
00147
00148 DEBUG_EXIT( "IonSilic()" );
00149 return;
00150 }