00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "AtomicOrbitalInverter.h"
00014
00015 AtomicOrbitalInverter::AtomicOrbitalInverter()
00016 {
00017 cutoff1 = 1.0;
00018 cutoff2 = 4.0;
00019 cutoff3 = 15.0;
00020 npoints_r = 1000;
00021 npoints_theta = 1000;
00022 npoints_phi = 1000;
00023 }
00024
00025 void AtomicOrbitalInverter::operator=( const AtomicOrbitalInverter & rhs )
00026 {
00027 xn = rhs.xn;
00028 yn = rhs.yn;
00029 zn = rhs.zn;
00030 cutoff1 = rhs.cutoff1;
00031 cutoff2 = rhs.cutoff2;
00032 cutoff3 = rhs.cutoff3;
00033 npoints_r = rhs.npoints_r;
00034 npoints_theta = rhs.npoints_theta;
00035 npoints_phi = rhs.npoints_phi;
00036 r_form = rhs.r_form;
00037 theta_form = rhs.theta_form;
00038 phi_form = rhs.phi_form;
00039 }
00040
00041
00042 void AtomicOrbitalInverter::set_npoints(int points_r,int points_theta,int points_phi)
00043 {
00044 npoints_r = points_r;
00045 npoints_theta = points_theta;
00046 npoints_phi = points_phi;
00047 }
00048
00049 void AtomicOrbitalInverter::initialize(int Xn, int Yn, int Zn,Array1D<double> B,Array1D<double> C)
00050 {
00051 xn = Xn;
00052 yn = Yn;
00053 zn = Zn;
00054
00055 b.allocate(B.dim1());
00056 c.allocate(C.dim1());
00057
00058 for(int i=0;i<B.dim1();i++)
00059 {
00060 b(i)=B(i);
00061 c(i)=C(i);
00062 }
00063
00064 Array1D<double> r_inp;
00065 Array1D<double> R_inp;
00066 Array1D<double> theta_inp;
00067 Array1D<double> THETA_inp;
00068 Array1D<double> phi_inp;
00069 Array1D<double> PHI_inp;
00070 r_inp.allocate(npoints_r);
00071 R_inp.allocate(npoints_r);
00072 theta_inp.allocate(npoints_theta);
00073 THETA_inp.allocate(npoints_theta);
00074 phi_inp.allocate(npoints_phi);
00075 PHI_inp.allocate(npoints_phi);
00076
00077 double rend1,rend2,rend3,dr1,dr2,dr3,dtheta,dphi,r,f;
00078 r = 0.0;
00079
00080 rend1 = cutoff1;
00081 rend2 = cutoff2;
00082 rend3 = cutoff3;
00083
00084 int np1,np2,np3;
00085 np1=npoints_r/3;
00086 np2=npoints_r/3;
00087 np3=npoints_r-np1-np2;
00088
00089 dr1=(rend1)/np1;
00090 dr2=(rend2-rend1)/np2;
00091 dr3=(rend3-rend2)/np3;
00092 dtheta=PI/npoints_theta;
00093 dphi=2.0*PI/npoints_phi;
00094
00095
00096 if(true)
00097 {
00098 r_inp(0)=0.0;
00099 for(int i=1;i<npoints_r;i++)
00100 {
00101 if(r_inp(i-1)<rend1)
00102 {
00103
00104 r=r_inp(i-1)+dr1;
00105 }
00106 else if(r_inp(i-1)<rend2)
00107 {
00108
00109 r=r_inp(i-1)+dr2;
00110 }
00111 else if(r_inp(i-1)<rend3)
00112 {
00113
00114 r=r_inp(i-1)+dr3;
00115 }
00116
00117 r_inp(i)=r;
00118
00119
00120 f=pow(r,xn+yn+zn)*eval_gaussians(r);
00121 f=f*f*r*r;
00122 R_inp(i)=f;
00123 }
00124
00125 for(int i=0;i<npoints_theta;i++)
00126 {
00127 theta_inp(i)=i*dtheta;
00128 THETA_inp(i)=pow(sin(theta_inp(i)),2*xn+2*yn)*pow(cos(theta_inp(i)),2*zn)*sin(theta_inp(i));
00129 }
00130
00131
00132 if(true)
00133 {
00134 for(int i=0;i<npoints_phi;i++)
00135 {
00136 phi_inp(i)=i*dphi;
00137 PHI_inp(i)=pow(cos(phi_inp(i)),2*xn)*pow(sin(phi_inp(i)),2*yn);
00138 }
00139 }
00140
00141
00142 r_form.initialize(r_inp,R_inp);
00143
00144 theta_form.initialize(theta_inp,THETA_inp);
00145
00146
00147 if(true)
00148 {
00149
00150 phi_form.initialize(phi_inp,PHI_inp);
00151 }
00152 }
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 void AtomicOrbitalInverter::get_xyz(double &x, double &y, double &z)
00165 {
00166 double r,theta,phi;
00167
00168 if(true)
00169 {
00170 r = r_form.random();
00171 theta = theta_form.random();
00172
00173 if(true)
00174 {
00175 phi = phi_form.random();
00176 }
00177 else
00178 {
00179
00180 phi=ran.unidev()*2.0*PI;
00181 }
00182 }
00183 else
00184 {
00185
00186 r = invert_gaussians();
00187 theta = ran.unidev()*PI;
00188 phi = ran.unidev()*2.0*PI;
00189 }
00190
00191 x = r * sin(theta)*cos(phi);
00192 y = r * sin(theta)*sin(phi);
00193 z = r * cos(theta);
00194 }
00195
00196 double AtomicOrbitalInverter::eval_gaussians(double r)
00197 {
00198 double sum=0.0;
00199 for(int i=0;i<b.dim1();i++)
00200 {
00201 sum = sum + c(i)*exp(-b(i)*r*r);
00202 }
00203 return sum;
00204 }
00205
00206
00207
00208 double AtomicOrbitalInverter::invert_gaussians()
00209 {
00210
00211
00212
00213 double sum_a=0.0;
00214 for(int i=0;i<b.dim1();i++)
00215 {
00216 for(int j=0;j<b.dim1();j++)
00217 {
00218 sum_a=sum_a+c(i)*c(j)*sqrt(PI/(b(i)+b(j)));
00219 }
00220 }
00221 double R=ran.unidev();
00222 double sum_b=0.0;
00223 int I,J;
00224 I = 0;
00225 J = 0;
00226 for(int i=0;i<b.dim1();i++)
00227 {
00228 for(int j=0;j<b.dim1();j++)
00229 {
00230 sum_b=sum_b+c(i)*c(j)*sqrt(PI/(b(i)+b(j)))/sum_a;
00231 if(sum_b>R)
00232 {
00233 I=i;
00234 J=j;
00235 i=b.dim1();
00236 j=b.dim1();
00237 }
00238 }
00239 }
00240
00241 double b_new=b(I)+b(J);
00242 double sigma=sqrt(1/2.0/b_new);
00243 return fabs(ran.gasdev()*sigma);
00244 }