ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-2.0/src/primitives/Bend.cpp
Revision: 1490
Committed: Fri Sep 24 04:16:43 2004 UTC (19 years, 9 months ago) by gezelter
Original Path: trunk/OOPSE-2.0/src/primitives/Bend.cpp
File size: 2511 byte(s)
Log Message:
Import of OOPSE v. 2.0

File Contents

# User Rev Content
1 gezelter 1490 #include "SRI.hpp"
2     #include "Atom.hpp"
3    
4     #include <math.h>
5     #include <iostream>
6     #include <stdlib.h>
7    
8     void Bend::set_atoms( Atom &a, Atom &b, Atom &c){
9    
10     c_p_a = &a;
11     c_p_b = &b;
12     c_p_c = &c;
13    
14     c_potential_E = 0.0;
15     }
16    
17    
18     void Bend::calc_forces(){
19    
20     double dx,dy,dz,gx,gy,gz,dx2,dy2,dz2,gx2,gy2,gz2;
21     double rij2, rkj2, riji2, rkji2, dot, denom, cosang, angl;
22    
23     double sina2, sinai;
24    
25     double comf2, comf3, comf4;
26     double dcsidx, dcsidy, dcsidz, dcskdx, dcskdy, dcskdz;
27     // double dcsjdx, dcsjdy, dcsjdz;
28     double dadxi, dadyi, dadzi;
29     double dadxk, dadyk, dadzk;//, dadxj, dadyj, dadzj;
30     double daxi, dayi, dazi, daxk, dayk, dazk, daxj, dayj, dazj;
31    
32     double aR[3], bR[3], cR[3];
33     double aF[3], bF[3], cF[3];
34    
35     c_p_a->getPos( aR );
36     c_p_b->getPos( bR );
37     c_p_c->getPos( cR );
38    
39    
40     dx = aR[0] - bR[0];
41     dy = aR[1] - bR[1];
42     dz = aR[2] - bR[2];
43    
44     gx = cR[0] - bR[0];
45     gy = cR[1] - bR[1];
46     gz = cR[2] - bR[2];
47    
48     dx2 = dx * dx;
49     dy2 = dy * dy;
50     dz2 = dz * dz;
51    
52     gx2 = gx * gx;
53     gy2 = gy * gy;
54     gz2 = gz * gz;
55    
56     rij2 = dx2 + dy2 + dz2;
57     rkj2 = gx2 + gy2 + gz2;
58    
59     riji2 = 1.0 / rij2;
60     rkji2 = 1.0 / rkj2;
61    
62     dot = dx * gx + dy * gy + dz * gz;
63     denom = sqrt((riji2 * rkji2));
64     cosang = dot * denom;
65    
66     if(cosang > 1.0)cosang = 1.0;
67     if(cosang < -1.0) cosang = -1.0;
68    
69     angl = acos(cosang);
70     angl = angl * 180.0 / M_PI;
71    
72     sina2 = 1.0 - cosang*cosang;
73     if(fabs(sina2) < 1.0E-12 ) sina2 = 1.0E-12;
74     sinai = 1.0 / sqrt(sina2);
75    
76     comf2 = cosang * riji2;
77     comf3 = cosang * rkji2;
78     comf4 = bend_force(angl);
79    
80    
81     dcsidx = gx*denom - comf2*dx;
82     dcsidy = gy*denom - comf2*dy;
83     dcsidz = gz*denom - comf2*dz;
84    
85     dcskdx = dx*denom - comf3*gx;
86     dcskdy = dy*denom - comf3*gy;
87     dcskdz = dz*denom - comf3*gz;
88    
89     // dcsjdx = -dcsidx - dcskdx;
90     // dcsjdy = -dcsidy - dcskdy;
91     // dcsjdz = -dcsidz - dcskdz;
92    
93     dadxi = -sinai*dcsidx;
94     dadyi = -sinai*dcsidy;
95     dadzi = -sinai*dcsidz;
96    
97     dadxk = -sinai*dcskdx;
98     dadyk = -sinai*dcskdy;
99     dadzk = -sinai*dcskdz;
100    
101     // dadxj = -dadxi - dadxk;
102     // dadyj = -dadyi - dadyk;
103     // dadzj = -dadzi - dadzk;
104    
105     daxi = comf4*dadxi;
106     dayi = comf4*dadyi;
107     dazi = comf4*dadzi;
108    
109     daxk = comf4*dadxk;
110     dayk = comf4*dadyk;
111     dazk = comf4*dadzk;
112    
113     daxj = -daxi - daxk;
114     dayj = -dayi - dayk;
115     dazj = -dazi - dazk;
116    
117     aF[0] = daxi;
118     aF[1] = dayi;
119     aF[2] = dazi;
120    
121     bF[0] = daxj;
122     bF[1] = dayj;
123     bF[2] = dazj;
124    
125     cF[0] = daxk;
126     cF[1] = dayk;
127     cF[2] = dazk;
128    
129     c_p_a->addFrc(aF);
130     c_p_b->addFrc(bF);
131     c_p_c->addFrc(cF);
132    
133     return;
134     }