00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "physconst.h"
00007 #include "iso.h"
00008 #include "dense.h"
00009 #include "taulines.h"
00010 #include "h2.h"
00011 #include "atomfeii.h"
00012 #include "rt.h"
00013
00014
00015
00016 double RT_line_driving(void)
00017 {
00018 long int i,
00019 ipHi,
00020 nelem,
00021 ipLo,
00022 ipISO;
00023
00024 double AllHeavy,
00025 AllRest,
00026 OneLine,
00027 fe2drive,
00028 forlin_v,
00029 h2drive,
00030 accel_iso[NISO];
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 DEBUG_ENTRY( "RT_line_driving()" );
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00056 {
00057 accel_iso[ipISO] = 0;
00058 for( nelem=ipISO; nelem < LIMELM; nelem++ )
00059 {
00060 if( (dense.IonHigh[nelem] >= nelem + 1-ipISO) )
00061 {
00062 for( ipHi=1; ipHi < iso_sp[ipISO][nelem].numLevels_local; ipHi++ )
00063 {
00064
00065 for( ipLo=0; ipLo < ipHi - 1; ipLo++ )
00066 {
00067
00068 if( iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont() > 0 )
00069 {
00070 OneLine = iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().pump()*
00071 iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyErg()*
00072 iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().PopOpc();
00073
00074 accel_iso[ipISO] += OneLine;
00075 }
00076 }
00077 }
00078
00079
00080 for( ipLo=0; ipLo < iso_sp[ipISO][nelem].numLevels_local; ipLo++ )
00081 {
00082
00083 TransitionList::iterator tr = SatelliteLines[ipISO][nelem].begin()+ipSatelliteLines[ipISO][nelem][ipLo];
00084 if((*tr).ipCont() > 0 )
00085 {
00086 OneLine = (*tr).Emis().pump()*
00087 (*tr).EnergyErg()*
00088 (*tr).Emis().PopOpc();
00089
00090 accel_iso[ipISO] += OneLine;
00091 }
00092
00093 }
00094
00095 for( ipHi=iso_sp[ipISO][nelem].st[iso_sp[ipISO][nelem].numLevels_local-1].n()+1; ipHi < iso_ctrl.nLyman[ipISO]; ipHi++ )
00096 {
00097
00098 TransitionList::iterator tr = ExtraLymanLines[ipISO][nelem].begin()+ipExtraLymanLines[ipISO][nelem][ipHi];
00099 if( (*tr).ipCont() > 0 )
00100 {
00101 OneLine = (*tr).Emis().pump()*
00102 (*tr).EnergyErg()*
00103 (*tr).Emis().PopOpc();
00104
00105 accel_iso[ipISO] += OneLine;
00106 }
00107
00108 }
00109 }
00110 }
00111 }
00112
00113
00114
00115 AllHeavy = 0.;
00116 for( i=1; i <= nLevel1; i++ )
00117 {
00118 OneLine =
00119 TauLines[i].Emis().pump()*
00120 TauLines[i].EnergyErg()*
00121 TauLines[i].Emis().PopOpc();
00122 AllHeavy += OneLine;
00123 }
00124
00125
00126
00127 AllRest = 0.;
00128 for( i=0; i < nWindLine; i++ )
00129 {
00130 OneLine =
00131 TauLine2[i].Emis().pump()*
00132 TauLine2[i].EnergyErg()*
00133 TauLine2[i].Emis().PopOpc();
00134 AllRest += OneLine;
00135 }
00136 for( i=0; i < nUTA; i++ )
00137 {
00138 OneLine =
00139 UTALines[i].Emis().pump()*
00140 UTALines[i].EnergyErg()*
00141 UTALines[i].Emis().PopOpc();
00142 AllRest += OneLine;
00143 }
00144 for( i=0; i < nHFLines; i++ )
00145 {
00146 OneLine =
00147 HFLines[i].Emis().pump()*
00148 HFLines[i].EnergyErg()*
00149 HFLines[i].Emis().PopOpc();
00150 AllRest += OneLine;
00151 }
00152
00153 for( long ipSpecies=0; ipSpecies<nSpecies; ipSpecies++ )
00154 {
00155 if( dBaseSpecies[ipSpecies].lgActive )
00156 {
00157 for (TransitionList::iterator tr=dBaseTrans[ipSpecies].begin();
00158 tr != dBaseTrans[ipSpecies].end(); ++tr)
00159 {
00160 int ipHi = (*tr).ipHi();
00161 if (ipHi >= dBaseSpecies[ipSpecies].numLevels_local || (*tr).ipCont() <= 0)
00162 continue;
00163 OneLine = (*tr).EnergyErg()*(*tr).Emis().pump()*(*tr).Emis().PopOpc();
00164 AllRest += OneLine;
00165 }
00166 }
00167 }
00168
00169
00170 h2drive = 0.;
00171 for( diatom_iter diatom = diatoms.begin(); diatom != diatoms.end(); ++diatom )
00172 h2drive += (*diatom)->H2_Accel();
00173
00174
00175 fe2drive = 0.;
00176 FeIIAccel(&fe2drive);
00177
00178 forlin_v = AllHeavy + accel_iso[ipH_LIKE] + accel_iso[ipHE_LIKE] +
00179 fe2drive + h2drive + AllRest;
00180
00181
00182
00183 return( forlin_v );
00184 }