1 /**********************************************************************
2   xyz2spherical.c:
3 
4      xyz2spherical.c is a subrutine to transform xyz coordinates to
5      sherical coordinates
6 
7   Log of xyz2spherical.c:
8 
9      22/Nov/2001  Released by T.Ozaki
10 
11 ***********************************************************************/
12 
13 #include <stdio.h>
14 #include <math.h>
15 #include "openmx_common.h"
16 
xyz2spherical(double x,double y,double z,double xo,double yo,double zo,double S_coordinate[3])17 void xyz2spherical(double x, double y, double z,
18                    double xo, double yo, double zo,
19                    double S_coordinate[3])
20 {
21   double dx,dy,dz,r,r1,theta,phi,dum,dum1,Min_r;
22 
23   Min_r = 10e-15;
24 
25   dx = x - xo;
26   dy = y - yo;
27   dz = z - zo;
28 
29   dum = dx*dx + dy*dy;
30   r = sqrt(dum + dz*dz);
31   r1 = sqrt(dum);
32 
33   if (Min_r<=r){
34 
35     if (r<fabs(dz))
36       dum1 = sgn(dz)*1.0;
37     else
38       dum1 = dz/r;
39 
40     theta = acos(dum1);
41 
42     if (Min_r<=r1){
43       if (0.0<=dx){
44 
45         if (r1<fabs(dy))
46           dum1 = sgn(dy)*1.0;
47         else
48           dum1 = dy/r1;
49 
50         phi = asin(dum1);
51       }
52       else{
53 
54         if (r1<fabs(dy))
55           dum1 = sgn(dy)*1.0;
56         else
57           dum1 = dy/r1;
58 
59         phi = PI - asin(dum1);
60       }
61     }
62     else{
63       phi = 0.0;
64     }
65   }
66   else{
67     theta = 0.5*PI;
68     phi = 0.0;
69   }
70 
71   S_coordinate[0] = r;
72   S_coordinate[1] = theta;
73   S_coordinate[2] = phi;
74 }
75 
76