00001 #ifndef __INCLUDE_REID93CC__
00002 #define __INCLUDE_REID93CC__
00003 #include "wavefunction.h"
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 void WaveFunctionRoutines::creid93(const double *r, const char *pname, const char *type,
00038 double *v11, double *v12, double *v22)
00039 {
00040 const double a[5][5] =
00041 { { 0.1756084, -14.14234, 151.8489, -686.823, 1104.157 },
00042 { -42.24976, 207.2246, -335.4364, -1.98925, -61.78469 },
00043 { 29.12845, 151.169, 8.151964, 58.32103, -20.74743 },
00044 { -0.5840566, -10.2931, 22.63391, 23.16915, -1.959172 },
00045 { -2.608488, 10.90858, -0.4374212, -21.48862, -0.6584788 }
00046 };
00047 const double b[5][5] =
00048 { { -22.34989, 255.1761, -1063.549, 1609.196, -3.505968 },
00049 { -4.248612, -5.352001, 182.7642, -392.7086, 58.12273 },
00050 { -2.904577, 38.02497, 0.3395927, 0.8318097, 1.923895 },
00051 { 0.0913746, -12.74773, 145.86, -643.2461, 1022.217 },
00052 { -0.046164, 7.950192, -1.925573, 50.66234, 8.359896 }
00053 };
00054 const double f0pi = 0.075;
00055 const double fcpi = 0.075;
00056 const double hbc = 197.327053;
00057 const double mpi0 = 134.9739;
00058 const double mpic = 139.5675;
00059 const double mpis = 139.5675;
00060
00061 const double r1 = 1.0;
00062 const double r2 = 2.0;
00063 const double r3 = 3.0;
00064 const double r4 = 4.0;
00065 const double r5 = 5.0;
00066 const double r6 = 6.0;
00067 const double r8 = 8.0;
00068
00069 int n,s,l,j,i;
00070 double mpi,ri,rj,x,f;
00071 double vc=0.0,vt=0.0,vls,vspi,vspis,vtpi;
00072
00073
00074
00075
00076
00077 s = (*(pname) == '1') ? 0 : 1;
00078 n = (toupper(*(pname+1)) == 'C') ? 2 : 1;
00079 j = atoi(&pname[2]);
00080 if (!strcmp(pname,"3P0"))
00081 { l = 1; }
00082 else if (n == 2)
00083 { l = j - 1; }
00084 else
00085 { l = j; }
00086 i = (s+l+1) % 2;
00087
00088 ri = (double)i;
00089 rj = (double)j;
00090
00091
00092
00093
00094 x = mpi0/hbc * *r;
00095 f = f0pi*mpi0*mpi0*mpi0/(mpis*mpis)/3.0;
00096 vspis = f*r93_p(&r1,&r8,&x);
00097 vspi = f*r93_y(&r1,&r8,&x);
00098 vtpi = f*r93_z(&r1,&r8,&x);
00099 if (!strcmp(type,"NP") || !strcmp(type,"PN"))
00100 {
00101 x = mpic/hbc * *r;
00102 f = (4.0*ri-2.0)*fcpi*mpic*mpic*mpic/(mpis*mpis)/3.0;
00103 vspis = f*r93_p(&r1,&r8,&x) - vspis;
00104 vspi = f*r93_y(&r1,&r8,&x) - vspi;
00105 vtpi = f*r93_z(&r1,&r8,&x) - vtpi;
00106 }
00107
00108
00109
00110
00111
00112 mpi = (mpi0 + 2.0*mpic)/3.0;
00113 x = mpi/hbc * *r;
00114 *v11 = *v12 = *v22 = 0.0;
00115
00116 if (!strcmp(pname,"1S0"))
00117 {
00118 if (!strcmp(type,"PP") || !strcmp(type,"NN"))
00119 {
00120 *v11 = a[0][0] * r93_y(&r2,&r8,&x)
00121 + a[0][1] * r93_y(&r3,&r8,&x)
00122 + a[0][2] * r93_y(&r4,&r8,&x)
00123 + a[0][3] * r93_y(&r5,&r8,&x)
00124 + a[0][4] * r93_y(&r6,&r8,&x);
00125 }
00126 else if (!strcmp(type,"NP") || !strcmp(type,"PN"))
00127 {
00128 *v11 = b[0][0] * r93_y(&r3,&r8,&x)
00129 + b[0][1] * r93_y(&r4,&r8,&x)
00130 + b[0][2] * r93_y(&r5,&r8,&x)
00131 + b[0][3] * r93_y(&r6,&r8,&x);
00132 }
00133 }
00134 else if (!strcmp(pname,"1D2"))
00135 {
00136 *v11 = a[1][0] * r93_y(&r4,&r8,&x)
00137 + a[1][1] * r93_y(&r5,&r8,&x)
00138 + a[1][2] * r93_y(&r6,&r8,&x);
00139 }
00140 else if (!strcmp(pname,"1G4"))
00141 {
00142 *v11 = a[1][3] * r93_y(&r3,&r8,&x);
00143 }
00144 else if (!strcmp(pname,"3P0"))
00145 {
00146 *v11 = a[2][0] * r93_y(&r3,&r8,&x)
00147 + a[2][1] * r93_y(&r5,&r8,&x)
00148 + a[1][4] * r93_z(&r3,&r8,&x)/3.0;
00149 }
00150 else if (!strcmp(pname,"3P1"))
00151 {
00152 *v11 = a[2][2] * r93_y(&r3,&r8,&x)
00153 + a[2][3] * r93_y(&r5,&r8,&x)
00154 + a[2][4] * r93_z(&r3,&r8,&x)/3.0;
00155 }
00156 else if (!strcmp(pname,"3F3"))
00157 {
00158 *v11 = a[3][4] * r93_y(&r3,&r8,&x);
00159 }
00160 else if (!strcmp(pname,"1P1"))
00161 {
00162 *v11 = b[1][0] * r93_y(&r3,&r8,&x)
00163 + b[1][1] * r93_y(&r4,&r8,&x)
00164 + b[1][2] * r93_y(&r5,&r8,&x)
00165 + b[1][3] * r93_y(&r6,&r8,&x);
00166 }
00167 else if (!strcmp(pname,"1F3"))
00168 {
00169 *v11 = b[0][4] * r93_y(&r3,&r8,&x)
00170 + b[1][4] * r93_y(&r5,&r8,&x);
00171 }
00172 else if (!strcmp(pname,"3D2"))
00173 {
00174 *v11 = b[2][0] * r93_y(&r3,&r8,&x)
00175 + b[2][1] * r93_y(&r5,&r8,&x)
00176 + b[2][2] * r93_z(&r3,&r8,&x)/3.0;
00177 }
00178 else if (!strcmp(pname,"3G4"))
00179 {
00180 *v11 = b[2][3] * r93_y(&r3,&r8,&x);
00181 }
00182 else if (!strcmp(pname,"3C2") || !strcmp(pname,"3C4"))
00183 {
00184 vc = a[3][0] * r93_y(&r3,&r8,&x)
00185 + a[3][1] * r93_y(&r4,&r8,&x)
00186 + a[3][2] * r93_y(&r5,&r8,&x)
00187 + a[3][3] * r93_y(&r6,&r8,&x);
00188 vt = (a[4][0] * r93_z(&r4,&r8,&x) + a[4][1] * r93_z(&r6,&r8,&x))/3.0;
00189 if (!strcmp(pname,"3C2"))
00190 { vls = a[4][2] * r93_w(&r3,&r8,&x) + a[4][3] * r93_w(&r5,&r8,&x); }
00191 else
00192 { vls = a[4][4] * r93_w(&r3,&r8,&x); }
00193 *v11 = vc + (rj-1.0)*vls - 2.0*(rj-1.0)/(2.0*rj+1.0)*vt;
00194 *v22 = vc - (rj+2.0)*vls - 2.0*(rj+2.0)/(2.0*rj+1.0)*vt;
00195 *v12 = 6.0*sqrt(rj*(rj+1.0))/(2.0*rj+1.0)*vt;
00196 }
00197 else if (!strcmp(pname,"3C1") || !strcmp(pname,"3C3"))
00198 {
00199 vc = b[3][0] * r93_y(&r2,&r8,&x)
00200 + b[3][1] * r93_y(&r3,&r8,&x)
00201 + b[3][2] * r93_y(&r4,&r8,&x)
00202 + b[3][3] * r93_y(&r5,&r8,&x)
00203 + b[3][4] * r93_y(&r6,&r8,&x);
00204 vt = (b[2][4] * r93_z(&r4,&r8,&x) + b[4][4] * r93_z(&r6,&r8,&x))/3.0;
00205 if (!strcmp(pname,"3C1"))
00206 { vls = b[4][0] * r93_w(&r3,&r8,&x) + b[4][1] * r93_w(&r5,&r8,&x); }
00207 else
00208 { vls = b[4][2] * r93_w(&r3,&r8,&x) + b[4][3] * r93_w(&r5,&r8,&x); }
00209 *v11 = vc + (rj-1.0)*vls - 2.0*(rj-1.0)/(2.0*rj+1.0)*vt;
00210 *v22 = vc - (rj+2.0)*vls - 2.0*(rj+2.0)/(2.0*rj+1.0)*vt;
00211 *v12 = 6.0*sqrt(rj*(rj+1.0))/(2.0*rj+1.0)*vt;
00212 }
00213 else
00214 {
00215 switch(s)
00216 {
00217 case 0:
00218 switch(i)
00219 {
00220 case 1:
00221 *v11 = a[0][0] * r93_y(&r2,&r8,&x)
00222 + a[0][1] * r93_y(&r3,&r8,&x)
00223 + a[0][2] * r93_y(&r4,&r8,&x)
00224 + a[0][3] * r93_y(&r5,&r8,&x)
00225 + a[0][4] * r93_y(&r6,&r8,&x);
00226 break;
00227 case 0:
00228 *v11 = b[1][0] * r93_y(&r3,&r8,&x)
00229 + b[1][1] * r93_y(&r4,&r8,&x)
00230 + b[1][2] * r93_y(&r5,&r8,&x)
00231 + b[1][3] * r93_y(&r6,&r8,&x);
00232 break;
00233 }
00234 break;
00235 case 1:
00236 switch(i)
00237 {
00238 case 1:
00239 vc = a[3][0] * r93_y(&r3,&r8,&x)
00240 + a[3][1] * r93_y(&r4,&r8,&x)
00241 + a[3][2] * r93_y(&r5,&r8,&x)
00242 + a[3][3] * r93_y(&r6,&r8,&x);
00243 vt = ( a[4][0] * r93_z(&r4,&r8,&x)
00244 + a[4][1] * r93_z(&r6,&r8,&x) )/3.0;
00245 break;
00246 case 0:
00247 vc = b[3][0] * r93_y(&r2,&r8,&x)
00248 + b[3][1] * r93_y(&r3,&r8,&x)
00249 + b[3][2] * r93_y(&r4,&r8,&x)
00250 + b[3][3] * r93_y(&r5,&r8,&x)
00251 + b[3][4] * r93_y(&r6,&r8,&x);
00252 vt = ( b[2][4] * r93_z(&r4,&r8,&x)
00253 + b[4][4] * r93_z(&r6,&r8,&x) )/3.0;
00254 break;
00255 }
00256 switch(n)
00257 {
00258 case 1:
00259 if (l == (j-1))
00260 { *v11 = vc - 2.0*(rj-1.0)/(2.0*rj+1.0)*vt; }
00261 else if (l == j)
00262 { *v11 = vc + 2.0*vt; }
00263 else if (l == (j+1))
00264 { *v11 = vc - 2.0*(rj+2.0)/(2.0*rj+1.0)*vt; }
00265 break;
00266 case 2:
00267 *v11 = vc - 2.0*(rj-1.0)/(2.0*rj+1.0)*vt;
00268 *v22 = vc - 2.0*(rj+2.0)/(2.0*rj+1.0)*vt;
00269 *v12 = 6.0*sqrt(rj*(rj+1.0))/(2.0*rj+1.0)*vt;
00270 break;
00271 }
00272 break;
00273 }
00274 }
00275
00276 *v11 *= mpi;
00277 *v12 *= mpi;
00278 *v22 *= mpi;
00279
00280
00281
00282
00283
00284 switch(n)
00285 {
00286 case 1:
00287 if (s == 0)
00288 {
00289 if (l == 0)
00290 { *v11 += -3.0*vspis; }
00291 else
00292 { *v11 += -3.0*vspi; }
00293 }
00294 else if (l == j)
00295 { *v11 += vspi + 2.0*vtpi; }
00296 else if (!strcmp(pname,"3P0"))
00297 { *v11 += vspi - 2.0*(rj+2.0)/(2.0*rj+1.0)*vtpi; }
00298 break;
00299 case 2:
00300 if (l == 0)
00301 { *v11 += vspis - 2.0*(rj-1.0)/(2.0*rj+1.0)*vtpi; }
00302 else
00303 { *v11 += vspi - 2.0*(rj-1.0)/(2.0*rj+1.0)*vtpi; }
00304 *v22 += vspi - 2.0*(rj+2.0)/(2.0*rj+1.0)*vtpi;
00305 *v12 += 6.0*sqrt(rj*(rj+1.0))/(2.0*rj+1.0)*vtpi;
00306 break;
00307 }
00308 return;
00309 }
00310
00311 double WaveFunctionRoutines::r93_y(const double *n, const double *m, const double *x)
00312 {
00313 double y;
00314
00315 if (*x < 0.0001)
00316 { y = -(*n) + (*m)/2.0 + (*n)*(*n)/(2.0*(*m)); }
00317 else
00318 { y = exp(-(*n)*(*x))/(*x) -
00319 exp(-(*m)*(*x))/(*x)*(1.0+((*m)*(*m)-(*n)*(*n))*(*x)/(2.0*(*m))); }
00320
00321 return y;
00322 }
00323
00324 double WaveFunctionRoutines::r93_p(const double *n, const double *m, const double *x)
00325 {
00326 double n2 = (*n)*(*n);
00327 double m2 = (*m)*(*m);
00328 double d,y;
00329
00330 if (*x < 0.0001)
00331 {
00332 d = (*m)*(m2-n2)/(2.0*n2);
00333 y = -(*n) + (*m) - d + (*x)*(n2/2.0 + m2/2.0 + (*m)*d);
00334 }
00335 else
00336 { y = exp(-(*n)*(*x))/(*x) -
00337 exp(-(*m)*(*x))/(*x)*(1.0+(m2-n2)*(*m)*(*x)/(2.0*n2)); }
00338 return y;
00339 }
00340
00341 double WaveFunctionRoutines::r93_w(const double *n, const double *m, const double *x)
00342 {
00343 double n2 = (*n)*(*n);
00344 double m2 = (*m)*(*m);
00345 double x2,y;
00346
00347 if (*x < 0.0001)
00348 {
00349 y = (2.0*(*n) - 3.0*(*m) + m2*(*m)/n2)/6.0 +
00350 (*x)*(2.0*m2 - n2 - m2*m2/n2)/8.0;
00351 }
00352 else
00353 {
00354 x2 = (*x)*(*x);
00355 y = exp(-(*n)*(*x))/(*x)*(1.0/((*n)*(*x))+1.0/(n2*x2))
00356 - exp(-(*m)*(*x))/(*x)*(1.0/((*m)*(*x))+1.0/(m2*x2))*m2/n2
00357 - exp(-(*m)*(*x))/(*x)*(m2-n2)/(2.0*n2);
00358 }
00359 return y;
00360 }
00361
00362 double WaveFunctionRoutines::r93_z(const double *n, const double *m, const double *x)
00363 {
00364 double n2 = (*n)*(*n);
00365 double m2 = (*m)*(*m);
00366 double x2,y;
00367
00368 if (*x < 0.0001)
00369 { y = (*x)*(n2 + 3.0*m2*m2/n2 - 4.0*m2)/8.0; }
00370 else
00371 {
00372 x2 = (*x)*(*x);
00373 y = exp(-(*n)*(*x))/(*x)*(1.0+3.0/((*n)*(*x))+3.0/(n2*x2))
00374 - exp(-(*m)*(*x))/(*x)*(1.0+3.0/((*m)*(*x))+3.0/(m2*x2))*m2/n2
00375 - exp(-(*m)*(*x))*(1.0+1.0/((*m)*(*x)))**m*(m2-n2)/(2.0*n2);
00376 }
00377 return y;
00378 }
00379
00380 #endif