ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/GhostBend.cpp
Revision: 539
Committed: Tue May 20 16:44:06 2003 UTC (21 years, 1 month ago) by mmeineke
File size: 3243 byte(s)
Log Message:
fixed an a mismatched Ghostbend bug.

File Contents

# Content
1
2 #include <math.h>
3 #include <iostream>
4 #include <stdlib.h>
5
6 #include "simError.h"
7 #include "SRI.hpp"
8 #include "Atom.hpp"
9
10
11
12 GhostBend::GhostBend( Atom &a, Atom &b ){
13
14 c_p_a = &a;
15
16 if( !b.isDirectional() ){
17
18 // if atom b is not directional, then bad things will happen
19
20 sprintf( painCave.errMsg,
21 " Ghost Bend error: Atom # %d of type \"%s\" is not "
22 "directional.\n",
23 b.getIndex(),
24 b.getType() );
25 painCave.isFatal = 1;
26 simError();
27 }
28
29 atomB = ( DirectionalAtom* ) &b;
30
31 c_potential_E = 0.0;
32
33 }
34
35
36 void GhostBend::calc_forces(){
37
38 double dx,dy,dz,gx,gy,gz,dx2,dy2,dz2,gx2,gy2,gz2;
39 double rij2, rkj2, riji2, rkji2, dot, denom, cosang, angl;
40
41 double sina2, sinai;
42
43 double comf2, comf3, comf4;
44 double dcsidx, dcsidy, dcsidz, dcskdx, dcskdy, dcskdz;
45 // double dcsjdx, dcsjdy, dcsjdz;
46 double dadxi, dadyi, dadzi;
47 double dadxk, dadyk, dadzk;//, dadxj, dadyj, dadzj;
48 double daxi, dayi, dazi, daxk, dayk, dazk, daxj, dayj, dazj;
49 double u[3];
50
51 dx = c_p_a->getX() - atomB->getX();
52 dy = c_p_a->getY() - atomB->getY();
53 dz = c_p_a->getZ() - atomB->getZ();
54
55 atomB->getU(u);
56
57 gx = u[0];
58 gy = u[1];
59 gz = u[2];
60
61 dx2 = dx * dx;
62 dy2 = dy * dy;
63 dz2 = dz * dz;
64
65 gx2 = gx * gx;
66 gy2 = gy * gy;
67 gz2 = gz * gz;
68
69 rij2 = dx2 + dy2 + dz2;
70 rkj2 = gx2 + gy2 + gz2;
71
72 riji2 = 1.0 / rij2;
73 rkji2 = 1.0 / rkj2;
74
75 dot = dx * gx + dy * gy + dz * gz;
76 denom = sqrt((riji2 * rkji2));
77 cosang = dot * denom;
78
79 if(cosang > 1.0)cosang = 1.0;
80 if(cosang < -1.0) cosang = -1.0;
81
82 angl = acos(cosang);
83 angl = angl * 180.0 / M_PI;
84
85 sina2 = 1.0 - cosang*cosang;
86 if(fabs(sina2) < 1.0E-12 ) sina2 = 1.0E-12;
87 sinai = 1.0 / sqrt(sina2);
88
89 comf2 = cosang * riji2;
90 comf3 = cosang * rkji2;
91 comf4 = bend_force(angl);
92
93 dcsidx = gx*denom - comf2*dx;
94 dcsidy = gy*denom - comf2*dy;
95 dcsidz = gz*denom - comf2*dz;
96
97 dcskdx = dx*denom - comf3*gx;
98 dcskdy = dy*denom - comf3*gy;
99 dcskdz = dz*denom - comf3*gz;
100
101 // dcsjdx = -dcsidx - dcskdx;
102 // dcsjdy = -dcsidy - dcskdy;
103 // dcsjdz = -dcsidz - dcskdz;
104
105 dadxi = -sinai*dcsidx;
106 dadyi = -sinai*dcsidy;
107 dadzi = -sinai*dcsidz;
108
109 dadxk = -sinai*dcskdx;
110 dadyk = -sinai*dcskdy;
111 dadzk = -sinai*dcskdz;
112
113 // dadxj = -dadxi - dadxk;
114 // dadyj = -dadyi - dadyk;
115 // dadzj = -dadzi - dadzk;
116
117 daxi = comf4*dadxi;
118 dayi = comf4*dadyi;
119 dazi = comf4*dadzi;
120
121 daxk = comf4*dadxk;
122 dayk = comf4*dadyk;
123 dazk = comf4*dadzk;
124
125 daxj = -daxi - daxk;
126 dayj = -dayi - dayk;
127 dazj = -dazi - dazk;
128
129 c_p_a->addFx(daxi);
130 c_p_a->addFy(dayi);
131 c_p_a->addFz(dazi);
132
133 atomB->addFx(daxj + daxk);
134 atomB->addFy(dayj + dayk);
135 atomB->addFz(dazj + dazk);
136
137 atomB->addTx(gy*dazk - gz*dayk);
138 atomB->addTy(gz*daxk - gx*dazk);
139 atomB->addTz(gx*dayk - gy*daxk);
140
141 return;
142 }
143
144 void GhostBend::setConstants( double the_c1, double the_c2, double the_c3,
145 double the_Th0 ){
146 c1 = the_c1;
147 c2 = the_c2;
148 c3 = the_c3;
149 theta0 = the_Th0;
150 }
151
152
153 double GhostBend::bend_force( double theta ){
154
155 double dt, dt2;
156 double force;
157
158 dt = ( theta - theta0 ) * M_PI / 180.0;
159 dt2 = dt * dt;
160
161 c_potential_E = ( c1 * dt2 ) + ( c2 * dt ) + c3;
162 force = -( ( 2.0 * c1 * dt ) + c2 );
163 return force;
164 }