ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/GhostBend.cpp
Revision: 378
Committed: Fri Mar 21 17:42:12 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 3365 byte(s)
Log Message:
This commit was generated by cvs2svn to compensate for changes in r377,
which included commits to RCS files with non-trunk default branches.

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     #ifdef IS_MPI
34     sprintf( checkPointMsg,
35     "Succesfull creation of Ghost bend\n" );
36     MPIcheckPoint();
37     #endif // is_mpi
38    
39     }
40    
41    
42     void GhostBend::calc_forces(){
43    
44     double dx,dy,dz,gx,gy,gz,dx2,dy2,dz2,gx2,gy2,gz2;
45     double rij2, rkj2, riji2, rkji2, dot, denom, cosang, angl;
46    
47     double sina2, sinai;
48    
49     double comf2, comf3, comf4;
50     double dcsidx, dcsidy, dcsidz, dcskdx, dcskdy, dcskdz;
51     // double dcsjdx, dcsjdy, dcsjdz;
52     double dadxi, dadyi, dadzi;
53     double dadxk, dadyk, dadzk;//, dadxj, dadyj, dadzj;
54     double daxi, dayi, dazi, daxk, dayk, dazk, daxj, dayj, dazj;
55     double u[3];
56    
57     dx = c_p_a->getX() - atomB->getX();
58     dy = c_p_a->getY() - atomB->getY();
59     dz = c_p_a->getZ() - atomB->getZ();
60    
61     atomB->getU(u);
62    
63     gx = u[0];
64     gy = u[1];
65     gz = u[2];
66    
67     dx2 = dx * dx;
68     dy2 = dy * dy;
69     dz2 = dz * dz;
70    
71     gx2 = gx * gx;
72     gy2 = gy * gy;
73     gz2 = gz * gz;
74    
75     rij2 = dx2 + dy2 + dz2;
76     rkj2 = gx2 + gy2 + gz2;
77    
78     riji2 = 1.0 / rij2;
79     rkji2 = 1.0 / rkj2;
80    
81     dot = dx * gx + dy * gy + dz * gz;
82     denom = sqrt((riji2 * rkji2));
83     cosang = dot * denom;
84    
85     if(cosang > 1.0)cosang = 1.0;
86     if(cosang < -1.0) cosang = -1.0;
87    
88     angl = acos(cosang);
89     angl = angl * 180.0 / M_PI;
90    
91     sina2 = 1.0 - cosang*cosang;
92     if(fabs(sina2) < 1.0E-12 ) sina2 = 1.0E-12;
93     sinai = 1.0 / sqrt(sina2);
94    
95     comf2 = cosang * riji2;
96     comf3 = cosang * rkji2;
97     comf4 = bend_force(angl);
98    
99     dcsidx = gx*denom - comf2*dx;
100     dcsidy = gy*denom - comf2*dy;
101     dcsidz = gz*denom - comf2*dz;
102    
103     dcskdx = dx*denom - comf3*gx;
104     dcskdy = dy*denom - comf3*gy;
105     dcskdz = dz*denom - comf3*gz;
106    
107     // dcsjdx = -dcsidx - dcskdx;
108     // dcsjdy = -dcsidy - dcskdy;
109     // dcsjdz = -dcsidz - dcskdz;
110    
111     dadxi = -sinai*dcsidx;
112     dadyi = -sinai*dcsidy;
113     dadzi = -sinai*dcsidz;
114    
115     dadxk = -sinai*dcskdx;
116     dadyk = -sinai*dcskdy;
117     dadzk = -sinai*dcskdz;
118    
119     // dadxj = -dadxi - dadxk;
120     // dadyj = -dadyi - dadyk;
121     // dadzj = -dadzi - dadzk;
122    
123     daxi = comf4*dadxi;
124     dayi = comf4*dadyi;
125     dazi = comf4*dadzi;
126    
127     daxk = comf4*dadxk;
128     dayk = comf4*dadyk;
129     dazk = comf4*dadzk;
130    
131     daxj = -daxi - daxk;
132     dayj = -dayi - dayk;
133     dazj = -dazi - dazk;
134    
135     c_p_a->addFx(daxi);
136     c_p_a->addFy(dayi);
137     c_p_a->addFz(dazi);
138    
139     atomB->addFx(daxj + daxk);
140     atomB->addFy(dayj + dayk);
141     atomB->addFz(dazj + dazk);
142    
143     atomB->addTx(gy*dazk - gz*dayk);
144     atomB->addTy(gz*daxk - gx*dazk);
145     atomB->addTz(gx*dayk - gy*daxk);
146    
147     return;
148     }
149    
150     void GhostBend::setConstants( double the_c1, double the_c2, double the_c3,
151     double the_Th0 ){
152     c1 = the_c1;
153     c2 = the_c2;
154     c3 = the_c3;
155     theta0 = the_Th0;
156     }
157    
158    
159     double GhostBend::bend_force( double theta ){
160    
161     double dt, dt2;
162     double force;
163    
164     dt = ( theta - theta0 ) * M_PI / 180.0;
165     dt2 = dt * dt;
166    
167     c_potential_E = ( c1 * dt2 ) + ( c2 * dt ) + c3;
168     force = -( ( 2.0 * c1 * dt ) + c2 );
169     return force;
170     }