ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-4/src/primitives/GhostBend.cpp
Revision: 1692
Committed: Mon Nov 1 20:15:58 2004 UTC (19 years, 8 months ago) by tim
File size: 3541 byte(s)
Log Message:
break, break and break.....

File Contents

# User Rev Content
1 tim 1692
2     #include <math.h>
3     #include <iostream>
4     #include <stdlib.h>
5    
6     #include "utils/simError.h"
7     #include "primitives/SRI.hpp"
8     #include "primitives/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     Vector3d u;
50    
51     double aR[3], bR[3];
52     double aF[3], bF[3], bTrq[3];
53    
54     aR = c_p_a->getPos();
55     bR = atomB->getPos();
56    
57    
58     dx = aR[0] - bR[0];
59     dy = aR[1] - bR[1];
60     dz = aR[2] - bR[2];
61    
62     u = atomB->getU();
63    
64     gx = u[0];
65     gy = u[1];
66     gz = u[2];
67    
68     dx2 = dx * dx;
69     dy2 = dy * dy;
70     dz2 = dz * dz;
71    
72     gx2 = gx * gx;
73     gy2 = gy * gy;
74     gz2 = gz * gz;
75    
76     rij2 = dx2 + dy2 + dz2;
77     rkj2 = gx2 + gy2 + gz2;
78    
79     riji2 = 1.0 / rij2;
80     rkji2 = 1.0 / rkj2;
81    
82     dot = dx * gx + dy * gy + dz * gz;
83     denom = sqrt((riji2 * rkji2));
84     cosang = dot * denom;
85    
86     if(cosang > 1.0)cosang = 1.0;
87     if(cosang < -1.0) cosang = -1.0;
88    
89     angl = acos(cosang);
90     angl = angl * 180.0 / M_PI;
91    
92     sina2 = 1.0 - cosang*cosang;
93     if(fabs(sina2) < 1.0E-12 ) sina2 = 1.0E-12;
94     sinai = 1.0 / sqrt(sina2);
95    
96     comf2 = cosang * riji2;
97     comf3 = cosang * rkji2;
98     comf4 = bend_force(angl);
99    
100     dcsidx = gx*denom - comf2*dx;
101     dcsidy = gy*denom - comf2*dy;
102     dcsidz = gz*denom - comf2*dz;
103    
104     dcskdx = dx*denom - comf3*gx;
105     dcskdy = dy*denom - comf3*gy;
106     dcskdz = dz*denom - comf3*gz;
107    
108     // dcsjdx = -dcsidx - dcskdx;
109     // dcsjdy = -dcsidy - dcskdy;
110     // dcsjdz = -dcsidz - dcskdz;
111    
112     dadxi = -sinai*dcsidx;
113     dadyi = -sinai*dcsidy;
114     dadzi = -sinai*dcsidz;
115    
116     dadxk = -sinai*dcskdx;
117     dadyk = -sinai*dcskdy;
118     dadzk = -sinai*dcskdz;
119    
120     // dadxj = -dadxi - dadxk;
121     // dadyj = -dadyi - dadyk;
122     // dadzj = -dadzi - dadzk;
123    
124     daxi = comf4*dadxi;
125     dayi = comf4*dadyi;
126     dazi = comf4*dadzi;
127    
128     daxk = comf4*dadxk;
129     dayk = comf4*dadyk;
130     dazk = comf4*dadzk;
131    
132     daxj = -daxi - daxk;
133     dayj = -dayi - dayk;
134     dazj = -dazi - dazk;
135    
136     aF[0] = daxi;
137     aF[1] = dayi;
138     aF[2] = dazi;
139    
140     bF[0] = daxj + daxk;
141     bF[1] = dayj + dayk;
142     bF[2] = dazj + dazk;
143    
144     bTrq[0] = gy*dazk - gz*dayk;
145     bTrq[1] = gz*daxk - gx*dazk;
146     bTrq[2] = gx*dayk - gy*daxk;
147    
148    
149     c_p_a->addFrc( aF );
150     atomB->addFrc( bF );
151     atomB->addTrq( bTrq );
152    
153     return;
154     }
155    
156     void GhostBend::setConstants( double the_c1, double the_c2, double the_c3,
157     double the_Th0 ){
158     c1 = the_c1;
159     c2 = the_c2;
160     c3 = the_c3;
161     theta0 = the_Th0;
162     }
163    
164    
165     double GhostBend::bend_force( double theta ){
166    
167     double dt, dt2;
168     double force;
169    
170     dt = ( theta - theta0 ) * M_PI / 180.0;
171     dt2 = dt * dt;
172    
173     c_potential_E = ( c1 * dt2 ) + ( c2 * dt ) + c3;
174     force = -( ( 2.0 * c1 * dt ) + c2 );
175     return force;
176     }