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

# User Rev Content
1 mmeineke 377
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     }