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