00001 #include "soubase.h"
00002 #include "sou1d_2gauss.h"
00003 #include <iostream>
00004 #include <cmath>
00005 #include "constants.h"
00006 #include "message.h"
00007
00008 using namespace std;
00009
00010
00011
00013 bool C2GaussianSource::Read(const parameterMap& s){
00014 mSigma1 = parameter::getD(s,"width1",0);
00015 mSigma2 = parameter::getD(s,"width2",0);
00016 mFraction1 = parameter::getD(s,"fraction1",0);
00017 return CSourceFtnBase::Read(s)&&CObject1d::Read(s);
00018 }
00019
00021 bool C2GaussianSource::Write(parameterMap& s){
00022 CSourceFtnBase::Write(s)&&CObject1d::Write(s);
00023 parameter::set(s,"width1",mSigma1);
00024 parameter::set(s,"width2",mSigma2);
00025 parameter::set(s,"fraction1",mFraction1);
00026 return true;
00027 }
00028
00029 C2GaussianSource::C2GaussianSource(){
00030 mSigma1=0;
00031 mFraction1=0;
00032 mSigma2=0;
00033 }
00034
00035 C2GaussianSource::~C2GaussianSource()
00036 {
00037 }
00038
00039 double C2GaussianSource::getValue(double r) const
00040 {
00041 return const_cast<C2GaussianSource*>(this)->Function(r);
00042 }
00043
00044 void C2GaussianSource::SetParameter(TwoGaussianParameter ParameterName,
00045 double value){
00046 switch(ParameterName)
00047 {
00048 case Fraction1:
00049 mFraction1=value;
00050 break;
00051 case Sigma1:
00052 mSigma1=value;
00053 break;
00054 case Sigma2:
00055 mSigma2=value;
00056 break;
00057 break;
00058 default:
00059 MESSAGE<<"How the #$^$#^ did you get to here?"<<ENDM_FATAL;
00060 }
00061 }
00062
00063
00064 double C2GaussianSource::Function(double r){
00065 double tmp,g1,g2,g3;
00066
00067 tmp = r/mSigma1;
00068 g1= mFraction1*mFraction1/pow(mSigma1*mSigma1*4*PI,3.0/2.0)*exp(-tmp*tmp/4);
00069 tmp = r/mSigma2;
00070 g2= (1-mFraction1)*(1-mFraction1)/pow(mSigma2*mSigma2*4*PI,3.0/2.0)*exp(-tmp*tmp/4);
00071 tmp= r*r/(mSigma1*mSigma1+mSigma2*mSigma2);
00072 g3= 2*mFraction1*(1-mFraction1)/pow(2*PI*(mSigma1*mSigma1+mSigma2*mSigma2),3.0/2.0)*exp(-tmp/2);
00073 return g1+g2+g3;
00074 }