00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "iso.h"
00007 #include "dense.h"
00008 #include "hydrogenic.h"
00009 #include "phycon.h"
00010 #include "rt.h"
00011
00012 STATIC realnum strkar( long nLo, long nHi );
00013
00014 void RT_stark(void)
00015 {
00016 long int ipLo,
00017 ipHi;
00018
00019 double aa , ah,
00020 stark,
00021 strkla;
00022
00023 DEBUG_ENTRY( "RT_stark()" );
00024
00025
00026 static long int nZoneEval=-1;
00027 if( nzone==nZoneEval )
00028 return;
00029 nZoneEval = nzone;
00030
00031 for( long ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00032 {
00033
00034 for( long nelem=ipISO; nelem<LIMELM; ++nelem )
00035 {
00036 if( nelem >= 2 && !dense.lgElmtOn[nelem] )
00037 continue;
00038
00039 t_iso_sp* sp = &iso_sp[ipISO][nelem];
00040
00041 if( !rt.lgStarkON )
00042 {
00043 for( ipHi=0; ipHi < sp->numLevels_max; ipHi++ )
00044 {
00045 for( ipLo=0; ipLo < sp->numLevels_max; ipLo++ )
00046 {
00047 sp->ex[ipHi][ipLo].pestrk = 0.;
00048 sp->ex[ipHi][ipLo].pestrk_up = 0.;
00049 }
00050 }
00051 continue;
00052 }
00053
00054
00055
00056
00057
00058
00059 ah = 6.9e-6*1000./1e12/(phycon.sqrte*phycon.te10*phycon.te10*
00060 phycon.te03*phycon.te01*phycon.te01)*dense.eden;
00061
00062
00063 ah *= pow( (double)(nelem+1), -4.5 );
00064
00065
00066
00067 stark = 0.264*pow(ah,0.4);
00068
00069
00070
00071 strkla = 0.538*ah*4.*9.875*(phycon.sqrte/phycon.te10/phycon.te03);
00072
00073 long ipHi = iso_ctrl.nLyaLevel[ipISO];
00074
00075
00076
00077
00078 aa = (realnum)SDIV(sp->trans(ipHi,0).Emis().TauIn());
00079 aa = pow( aa ,-0.75);
00080 sp->ex[ipHi][0].pestrk_up = strkla/2.*MAX2(1.,aa);
00081
00086 sp->ex[ipHi][0].pestrk_up =
00087 MIN2(.01,sp->ex[ipHi][0].pestrk_up);
00088 sp->ex[ipHi][0].pestrk_up = 0.;
00089 sp->ex[ipHi][0].pestrk = sp->ex[ipHi][0].pestrk_up *
00090 sp->trans(ipHi,0).Emis().Aul();
00091
00092
00093 for( ipHi=3; ipHi < sp->numLevels_local; ipHi++ )
00094 {
00095 if( sp->trans(ipHi,0).ipCont() <= 0 )
00096 continue;
00097
00098 sp->ex[ipHi][0].pestrk_up = stark / 2. *
00099 strkar( sp->st[0].n(), sp->st[ipHi].n() ) *
00100 pow(MAX2(1.,sp->trans(ipHi,0).Emis().TauIn()),-0.75);
00101
00102 sp->ex[ipHi][0].pestrk_up = MIN2(.01,sp->ex[ipHi][0].pestrk_up);
00103 sp->ex[ipHi][0].pestrk = sp->trans(ipHi,0).Emis().Aul()*
00104 sp->ex[ipHi][0].pestrk_up;
00105 }
00106
00107
00108 for( ipHi=sp->numLevels_local; ipHi < sp->numLevels_max; ipHi++ )
00109 {
00110 sp->ex[ipHi][0].pestrk_up = 0.;
00111 sp->ex[ipHi][0].pestrk = 0.;
00112 }
00113
00114
00115 for( ipLo=ipH2s; ipLo < (sp->numLevels_local - 1); ipLo++ )
00116 {
00117 for( ipHi=ipLo + 1; ipHi < sp->numLevels_local; ipHi++ )
00118 {
00119 if( sp->trans(ipHi,ipLo).ipCont() <= 0 )
00120 continue;
00121
00122 aa = stark *
00123 strkar( sp->st[ipLo].n(), sp->st[ipHi].n() ) *
00124 pow(MAX2(1.,sp->trans(ipHi,ipLo).Emis().TauIn()),-0.75);
00125 sp->ex[ipHi][ipLo].pestrk_up =
00126 (realnum)MIN2(.01,aa);
00127
00128 sp->ex[ipHi][ipLo].pestrk = sp->trans(ipHi,ipLo).Emis().Aul()*
00129 sp->ex[ipHi][ipLo].pestrk_up;
00130 }
00131 }
00132
00133
00134 for( ipLo=(sp->numLevels_local - 1); ipLo<(sp->numLevels_max - 1); ipLo++ )
00135 {
00136 for( ipHi=ipLo + 1; ipHi < sp->numLevels_max; ipHi++ )
00137 {
00138 sp->ex[ipHi][ipLo].pestrk_up = 0.;
00139 sp->ex[ipHi][ipLo].pestrk = 0.;
00140 }
00141 }
00142 }
00143 }
00144
00145 return;
00146 }
00147
00148 STATIC realnum strkar( long nLo, long nHi )
00149 {
00150 return (realnum)pow((realnum)( nLo * nHi ),(realnum)1.2f);
00151 }
00152