00001
00002
00003
00004
00005
00006 #include "cddefines.h"
00007 #include "rfield.h"
00008 #include "doppvel.h"
00009 #include "radius.h"
00010 #include "continuum.h"
00011 #include "transition.h"
00012 #include "rt.h"
00013
00014
00015
00016 class my_Integrand_con_pump_op
00017 {
00018 public:
00019
00020 realnum damp;
00021
00022 realnum PumpTau;
00023
00024 double operator() (double x)
00025 {
00026 realnum v, rx = realnum(x);
00027 VoigtH(damp,&rx,&v,1);
00028 double opfun_v = sexp(PumpTau*v)*v;
00029 return opfun_v;
00030 }
00031 };
00032
00033
00034 inline double fitted(double t)
00035 {
00036 return (0.98925439 + 0.084594094*t)/(1. + t*(0.64794212 + t*0.44743976));
00037 }
00038
00040 double DrvContPump(const TransitionProxy& t, realnum DopplerWidth)
00041 {
00042 double a0,
00043 ContPump_v,
00044 tau,
00045 yinc1,
00046 yinc2;
00047
00048 DEBUG_ENTRY( "DrvContPump()" );
00049
00050 if( !rfield.lgInducProcess )
00051 {
00052
00053 ContPump_v = 0.;
00054 }
00055 else
00056 {
00057
00058 tau = t.Emis().TauIn() + t.Emis().PopOpc() * t.Emis().opacity() / DopplerWidth * radius.dRNeff;
00059
00060 if( tau <= 10. )
00061 {
00062
00063 ContPump_v = fitted(tau);
00064 }
00065 else if( tau > 1e6 )
00066 {
00067
00068
00069 ContPump_v = 0.;
00070 }
00071 else
00072 {
00073 my_Integrand_con_pump_op func;
00074 if( t.Emis().iRedisFun() > 0 )
00075 {
00076 func.damp = t.Emis().damp();
00077 }
00078 else
00079 {
00080 func.damp = 0.;
00081 }
00082 func.PumpTau = (realnum)tau;
00083
00084 Integrator<my_Integrand_con_pump_op,Gaussian32> con_pump_op;
00085 static const double BREAK = 3.;
00086 yinc1 = con_pump_op.sum(0.,BREAK,func);
00087 yinc2 = con_pump_op.sum(BREAK,100.,func);
00088
00089 a0 = 0.886227*(1. + func.damp);
00090 ContPump_v = (yinc1 + yinc2)/a0;
00091 }
00092 }
00093
00094
00095
00096
00097
00098 return ContPump_v;
00099 }