ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/md_code/Bend.cpp
Revision: 134
Committed: Fri Oct 11 15:09:09 2002 UTC (21 years, 8 months ago) by chuckv
File size: 2463 byte(s)
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 mmeineke 10 #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 chuckv 134 // double dcsjdx, dcsjdy, dcsjdz;
28 mmeineke 10 double dadxi, dadyi, dadzi;
29 chuckv 134 double dadxk, dadyk, dadzk;//, dadxj, dadyj, dadzj;
30 mmeineke 10 double daxi, dayi, dazi, daxk, dayk, dazk, daxj, dayj, dazj;
31    
32    
33    
34     dx = c_p_a->getX() - c_p_b->getX();
35     dy = c_p_a->getY() - c_p_b->getY();
36     dz = c_p_a->getZ() - c_p_b->getZ();
37    
38     gx = c_p_c->getX() - c_p_b->getX();
39     gy = c_p_c->getY() - c_p_b->getY();
40     gz = c_p_c->getZ() - c_p_b->getZ();
41    
42     dx2 = dx * dx;
43     dy2 = dy * dy;
44     dz2 = dz * dz;
45    
46     gx2 = gx * gx;
47     gy2 = gy * gy;
48     gz2 = gz * gz;
49    
50     rij2 = dx2 + dy2 + dz2;
51     rkj2 = gx2 + gy2 + gz2;
52    
53     riji2 = 1.0 / rij2;
54     rkji2 = 1.0 / rkj2;
55    
56     dot = dx * gx + dy * gy + dz * gz;
57     denom = sqrt((riji2 * rkji2));
58     cosang = dot * denom;
59    
60     if(cosang > 1.0)cosang = 1.0;
61     if(cosang < -1.0) cosang = -1.0;
62    
63     angl = acos(cosang);
64     angl = angl * 180.0 / M_PI;
65    
66     sina2 = 1.0 - cosang*cosang;
67     if(fabs(sina2) < 1.0E-12 ) sina2 = 1.0E-12;
68     sinai = 1.0 / sqrt(sina2);
69    
70     comf2 = cosang * riji2;
71     comf3 = cosang * rkji2;
72     comf4 = bend_force(angl);
73    
74    
75     dcsidx = gx*denom - comf2*dx;
76     dcsidy = gy*denom - comf2*dy;
77     dcsidz = gz*denom - comf2*dz;
78    
79     dcskdx = dx*denom - comf3*gx;
80     dcskdy = dy*denom - comf3*gy;
81     dcskdz = dz*denom - comf3*gz;
82    
83 chuckv 134 // dcsjdx = -dcsidx - dcskdx;
84     // dcsjdy = -dcsidy - dcskdy;
85     // dcsjdz = -dcsidz - dcskdz;
86 mmeineke 10
87     dadxi = -sinai*dcsidx;
88     dadyi = -sinai*dcsidy;
89     dadzi = -sinai*dcsidz;
90    
91     dadxk = -sinai*dcskdx;
92     dadyk = -sinai*dcskdy;
93     dadzk = -sinai*dcskdz;
94    
95 chuckv 134 // dadxj = -dadxi - dadxk;
96     // dadyj = -dadyi - dadyk;
97     // dadzj = -dadzi - dadzk;
98 mmeineke 10
99     daxi = comf4*dadxi;
100     dayi = comf4*dadyi;
101     dazi = comf4*dadzi;
102    
103     daxk = comf4*dadxk;
104     dayk = comf4*dadyk;
105     dazk = comf4*dadzk;
106    
107     daxj = -daxi - daxk;
108     dayj = -dayi - dayk;
109     dazj = -dazi - dazk;
110    
111     c_p_a->addFx(daxi);
112     c_p_a->addFy(dayi);
113     c_p_a->addFz(dazi);
114    
115     c_p_b->addFx(daxj);
116     c_p_b->addFy(dayj);
117     c_p_b->addFz(dazj);
118    
119     c_p_c->addFx(daxk);
120     c_p_c->addFy(dayk);
121     c_p_c->addFz(dazk);
122    
123     return;
124     }