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