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

# Content
1 #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
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 // dcsjdx = -dcsidx - dcskdx;
84 // dcsjdy = -dcsidy - dcskdy;
85 // dcsjdz = -dcsidz - dcskdz;
86
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 // dadxj = -dadxi - dadxk;
96 // dadyj = -dadyi - dadyk;
97 // dadzj = -dadzi - dadzk;
98
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 }