00001
00002
00003
00004 #include "cddefines.h"
00005 #include "physconst.h"
00006 #include "rfield.h"
00007 #include "phycon.h"
00008 #include "opacity.h"
00009 #include "rt.h"
00010
00011 double RT_recom_effic(long int ip)
00012 {
00013 long int i;
00014 double dEner,
00015 denom,
00016 escin,
00017 escout,
00018 hnukt,
00019 receff_v,
00020 sum,
00021 tin,
00022 tout;
00023
00024 DEBUG_ENTRY( "RT_recom_effic()" );
00025
00026
00027
00028
00029 ASSERT( ip > 0 && ip <= rfield.nupper );
00030
00031 if( ip > rfield.nflux )
00032 {
00033
00034
00035
00036 receff_v = 1.;
00037
00038 DEBUG_EXIT( "RT_recom_effic()" );
00039 return( receff_v );
00040 }
00041
00042
00043 hnukt = TE1RYD*rfield.anu[ip-1]/phycon.te;
00044
00045
00046
00047 if( strcmp(rfield.chDffTrns,"OSS") == 0 )
00048 {
00049
00050 if( rfield.anu[ip] > 0.99 )
00051 {
00052
00053 receff_v = SMALLFLOAT;
00054 }
00055 else
00056 {
00057 receff_v = 1.;
00058 }
00059 }
00060 else if( strcmp(rfield.chDffTrns,"OTS") == 0 )
00061 {
00062 tin = opac.TauAbsGeo[0][ip-1];
00063 if( tin < 5. )
00064 {
00065 escin = esccon(tin,hnukt);
00066 }
00067 else
00068 {
00069 escin = 1e-4;
00070 }
00071
00072
00073 tout = opac.TauAbsGeo[1][ip-1] - tin;
00074
00075 if( opac.lgTauOutOn )
00076 {
00077
00078 if( tout > 0. )
00079 {
00080
00081 if( tout < 5. )
00082 {
00083 escout = esccon(tout,hnukt);
00084 }
00085 else
00086 {
00087 escout = 1e-4;
00088 }
00089 receff_v = 0.5*(escin + escout);
00090 }
00091 else
00092 {
00093
00094
00095
00096
00097 escout = esccon(tin*0.05,hnukt);
00098 receff_v = 0.5*(escin + escout);
00099 }
00100 }
00101 else
00102 {
00103 receff_v = escin;
00104 }
00105 }
00106 else if( strcmp(rfield.chDffTrns,"OU1") == 0 )
00107 {
00108 receff_v = opac.ExpZone[ip+1];
00109 }
00110 else if( strcmp(rfield.chDffTrns,"OU2") == 0 )
00111 {
00112
00113
00114 receff_v = opac.E2TauAbsFace[ip+1];
00115 }
00116 else if( strcmp(rfield.chDffTrns,"OU3") == 0 )
00117 {
00118 receff_v = 1.;
00119 }
00120 else if( strcmp(rfield.chDffTrns,"OU4") == 0 )
00121 {
00122
00123
00124 if( rfield.ContBoltz[ip-1] > 0. )
00125 {
00126 i = ip;
00127 dEner = phycon.te/TE1RYD*0.5;
00128 sum = 0.;
00129 denom = 0.;
00130 while( rfield.ContBoltz[i-1] > 0. &&
00131 rfield.anu[i-1]-rfield.anu[ip-1] < (float)dEner &&
00132 i <= rfield.nflux )
00133 {
00134 sum += rfield.ContBoltz[i-1]*opac.tmn[i-1];
00135 denom += rfield.ContBoltz[i-1];
00136 i += 1;
00137 }
00138 receff_v = sum/denom;
00139 }
00140 else
00141 {
00142 receff_v = opac.tmn[ip-1];
00143 }
00144 }
00145 else
00146 {
00147 fprintf( ioQQQ, " RECEFF does not understand the transfer method=%3.3s\n",
00148 rfield.chDffTrns );
00149 puts( "[Stop in RT_recom_effic]" );
00150 cdEXIT(EXIT_FAILURE);
00151 }
00152
00153 receff_v = MAX2((double)opac.otsmin,receff_v);
00154
00155 receff_v = MIN2(1.,receff_v);
00156
00157 DEBUG_EXIT( "RT_recom_effic()" );
00158 return( receff_v );
00159 }
00160