00001 #ifndef __INCLUDE_SOURCECALC_GX1D__
00002 #define __INCLUDE_SOURCECALC_GX1D__
00003 #include "sourcecalc.h"
00004
00005 using namespace std;
00006
00007 CSourceCalc_GX1D::CSourceCalc_GX1D(){
00008 InitSPars();
00009 }
00010
00011 void CSourceCalc_GX1D::InitSPars(){
00012
00013 parameter::set(spars,"lambda",0.6);
00014 parameter::set(spars,"Xfrac",0.5);
00015 parameter::set(spars,"R",5.0);
00016 parameter::set(spars,"X",10.0);
00017 parameter::set(spars,"a",5.0);
00018 }
00019
00020 void CSourceCalc_GX1D::SetSPars(double lambdaset,double Xfracset,
00021 double Rset,double Xset,double aset){
00022 parameter::set(spars,"lambda",lambdaset);
00023 parameter::set(spars,"R",Rset);
00024 parameter::set(spars,"Xfrac",Xfracset);
00025 parameter::set(spars,"X",Xset);
00026 parameter::set(spars,"a",aset);
00027 }
00028
00029 void CSourceCalc_GX1D::CalcS(int lx,int ly,int lz,CCHArray *A){
00030 const double PI=4.0*atan(1.0);
00031 int ir,L;
00032 int nradial;
00033 double lambdaG,lambdaX,R,X,a,lambda,Xfrac;
00034 double r,z,delr,normX,normG,value;
00035 lambda=parameter::getD(spars,"lambda",0.3);
00036 Xfrac=parameter::getD(spars,"Xfrac",0.5);
00037 lambdaG=lambda*(1.0-Xfrac);
00038 lambdaX=lambda*Xfrac;
00039 R=parameter::getD(spars,"R",5.0);
00040 X=parameter::getD(spars,"X",10.0);
00041 a=parameter::getD(spars,"a",5.0);
00042 normG=pow(4.0*R*R*PI,-1.5);
00043 z=2.0*R*R/(X*X);
00044 normX=1.0/(4.0*PI*X*X*X*(2.0*z*Bessel::K1(z)+z*z*Bessel::K0(z)));
00045
00046 nradial=A->GetNRADIAL();
00047 delr=A->GetRADSTEP();
00048
00049 L=lx+ly+lz;
00050
00051 for(ir=0;ir<nradial;ir++){
00052 r=delr*(0.5+ir);
00053 value=lambdaX*normX*exp(-sqrt(((r*r)/(X*X))+z*z));
00054 value+=lambdaG*normG*exp(-0.25*r*r/(R*R));
00055 if(L>0) value*=pow(r*r/(r*r+a*a),0.5*double(L));
00056 A->SetElement(lx,ly,lz,ir,value);
00057 }
00058
00059 }
00060
00061 void CSourceCalc_GX1D::CalcS(CCHArray *A){
00062 int dlx=1,dly=1,dlz=1;
00063 int lx,ly,lz,lmax;
00064 lmax=A->GetLMAX();
00065 if(A->GetXSYM()) dlx=2;
00066 if(A->GetYSYM()) dly=2;
00067 if(A->GetZSYM()) dlz=2;
00068 for(lx=0;lx<2;lx+=dlx){
00069 for(ly=0;ly<lmax-lx;ly+=dly){
00070 for(lz=0;lz<lmax-lx-ly;lz+=dlz){
00071 CalcS(lx,ly,lz,A);
00072 }
00073 }
00074 }
00075 }
00076
00077 #endif