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
00013
00014
00015 class my_Integrand_con_pump_op
00016 {
00017 public:
00018
00019 realnum damp;
00020
00021 realnum PumpTau;
00022
00023 double operator() (double x)
00024 {
00025 double v = vfun(damp,x);
00026 double opfun_v = sexp(PumpTau*v)*v;
00027 return( opfun_v );
00028 }
00029 };
00030
00032 double DrvContPump(transition * t, realnum DopplerWidth)
00033 {
00034 double a0,
00035 ContPump_v,
00036 tau,
00037 yinc1,
00038 yinc2;
00039
00040 DEBUG_ENTRY( "DrvContPump()" );
00041
00042
00043 # define FITTED(t) ((0.98925439 + 0.084594094*(t))/(1. + (t)*(0.64794212 + (t)*0.44743976)))
00044
00045 if( !rfield.lgInducProcess )
00046 {
00047
00048 ContPump_v = 0.;
00049 }
00050 else
00051 {
00052
00053 tau = t->Emis->TauIn + t->Emis->PopOpc * t->Emis->opacity / DopplerWidth * radius.dRNeff;
00054
00055 if( tau <= 10. )
00056 {
00057
00058 ContPump_v = FITTED(tau);
00059 }
00060 else if( tau > 1e6 )
00061 {
00062
00063
00064 ContPump_v = 0.;
00065 }
00066 else
00067 {
00068 my_Integrand_con_pump_op func;
00069 if( t->Emis->iRedisFun > 0 )
00070 {
00071 func.damp = t->Emis->damp;
00072 }
00073 else
00074 {
00075 func.damp = 0.;
00076 }
00077 func.PumpTau = (realnum)tau;
00078
00079 Integrator<my_Integrand_con_pump_op,Gaussian32> con_pump_op;
00080 # define BREAK_ 3.
00081 yinc1 = con_pump_op.sum(0.,BREAK_,func);
00082 yinc2 = con_pump_op.sum(BREAK_,100.,func);
00083
00084 a0 = 0.886227*(1. + func.damp);
00085 ContPump_v = (yinc1 + yinc2)/a0;
00086 }
00087 }
00088
00089
00090
00091
00092
00093 return( ContPump_v );
00094 # undef FITTED
00095 }