ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ForceFields.cpp
Revision: 1157
Committed: Tue May 11 20:33:41 2004 UTC (20 years, 1 month ago) by tim
File size: 5897 byte(s)
Log Message:
adding cutoffGroup into OOPSE

File Contents

# User Rev Content
1 mmeineke 561 #include <iostream>
2    
3     using namespace std;
4    
5    
6 gezelter 829 #include <stdlib.h>
7 mmeineke 377
8     #ifdef IS_MPI
9     #include <mpi.h>
10     #endif // is_mpi
11    
12    
13 chuckv 892 #ifdef PROFILE
14     #include "mdProfile.hpp"
15     #endif
16    
17 mmeineke 377 #include "simError.h"
18     #include "ForceFields.hpp"
19     #include "Atom.hpp"
20     #include "fortranWrappers.hpp"
21    
22    
23 mmeineke 420 void ForceFields::calcRcut( void ){
24    
25     #ifdef IS_MPI
26     double tempBig = bigSigma;
27 mmeineke 447 MPI_Allreduce( &tempBig, &bigSigma, 1, MPI_DOUBLE, MPI_MAX,
28     MPI_COMM_WORLD);
29 mmeineke 420 #endif //is_mpi
30    
31     //calc rCut and rList
32    
33 mmeineke 841 entry_plug->setDefaultRcut( 2.5 * bigSigma );
34 tim 781
35 mmeineke 420 }
36    
37 gezelter 1097 void ForceFields::setRcut( double LJrcut ) {
38    
39     #ifdef IS_MPI
40     double tempBig = bigSigma;
41     MPI_Allreduce( &tempBig, &bigSigma, 1, MPI_DOUBLE, MPI_MAX,
42     MPI_COMM_WORLD);
43     #endif //is_mpi
44    
45     if (LJrcut < 2.5 * bigSigma) {
46     sprintf( painCave.errMsg,
47     "Setting Lennard-Jones cutoff radius to %lf.\n"
48     "\tThis value is smaller than %lf, which is\n"
49     "\t2.5 * bigSigma, where bigSigma is the largest\n"
50     "\tvalue of sigma present in the simulation.\n"
51     "\tThis is potentially a problem since the LJ potential may\n"
52     "\tbe appreciable at this distance. If you don't want the\n"
53     "\tsmaller cutoff, change the LJrcut variable.\n",
54     LJrcut, 2.5*bigSigma);
55     painCave.isFatal = 0;
56     simError();
57     } else {
58     sprintf( painCave.errMsg,
59     "Setting Lennard-Jones cutoff radius to %lf.\n"
60     "\tThis value is larger than %lf, which is\n"
61     "\t2.5 * bigSigma, where bigSigma is the largest\n"
62     "\tvalue of sigma present in the simulation. This should\n"
63     "\tnot be a problem, but could adversely effect performance.\n",
64     LJrcut, 2.5*bigSigma);
65     painCave.isFatal = 0;
66     simError();
67     }
68    
69     //calc rCut and rList
70    
71     entry_plug->setDefaultRcut( LJrcut );
72     }
73    
74 mmeineke 377 void ForceFields::doForces( int calcPot, int calcStress ){
75    
76 tim 1157 int i, j, isError;
77 mmeineke 377 double* frc;
78     double* pos;
79     double* trq;
80     double* A;
81 tim 1136 double* u_l;
82     double* rc;
83     double* massRatio;
84 mmeineke 670 SimState* config;
85 mmeineke 377
86 tim 1157 Molecule* myMols;
87     Atom** myAtoms;
88     int numAtom;
89     int curIndex;
90     double mtot;
91     int numMol;
92     int numCutoffGroups;
93     CutoffGroup* myCutoffGroup;
94     vector<CutoffGroup*>::iterator iterCutoff;
95     Atom* cutoffAtom;
96     vector<Atom*>::iterator iterAtom;
97     double com[3];
98     double tempPos[3];
99     int atomIndex;
100    
101 mmeineke 377 short int passedCalcPot = (short int)calcPot;
102     short int passedCalcStress = (short int)calcStress;
103    
104 gezelter 484 // forces are zeroed here, before any are accumulated.
105 mmeineke 377 // NOTE: do not rezero the forces in Fortran.
106    
107     for(i=0; i<entry_plug->n_atoms; i++){
108 gezelter 484 entry_plug->atoms[i]->zeroForces();
109 mmeineke 377 }
110    
111 chuckv 892 #ifdef PROFILE
112     startProfile(pro7);
113     #endif
114    
115 mmeineke 423 for(i=0; i<entry_plug->n_mol; i++ ){
116 gezelter 1097 // CalcForces in molecules takes care of mapping rigid body coordinates
117     // into atomic coordinates
118 gezelter 1150 entry_plug->molecules[i].calcForces();
119 mmeineke 389 }
120    
121 chuckv 892 #ifdef PROFILE
122     endProfile( pro7 );
123     #endif
124    
125 mmeineke 670 config = entry_plug->getConfiguration();
126 mmeineke 597
127 mmeineke 670 frc = config->getFrcArray();
128     pos = config->getPosArray();
129     trq = config->getTrqArray();
130     A = config->getAmatArray();
131     u_l = config->getUlArray();
132 mmeineke 561
133 tim 1157 if(entry_plug->haveCutoffGroups){
134     //if
135     myMols = entry_plug->molecules;
136     numMol = entry_plug->n_mol;
137     for(int i = 0; i < numMol; i++){
138     numAtom = myMols[i].getNAtoms();
139     myAtoms = myMols[i].getMyAtoms();
140    
141    
142     for(int j = 0; j < numAtom; j++){
143     #ifdef IS_MPI
144     atomIndex = myAtoms[j]->getGlobalIndex();
145     #else
146     atomIndex = myAtoms[j]->getIndex();
147     #endif
148    
149     if(myMols[i].belongToCutoffGroup(atomIndex))
150     continue;
151     else{
152     myAtoms[j]->getPos(tempPos);
153     myAtoms[j]->setRc(tempPos);
154     }
155    
156     }
157    
158     numCutoffGroups = myMols[i].getNCutoffGroups();
159     for(myCutoffGroup =myMols[i].beginCutoffGroup(iterCutoff); myCutoffGroup != NULL;
160     myCutoffGroup =myMols[i].nextCutoffGroup(iterCutoff)){
161     //get center of mass of the cutoff group
162     myCutoffGroup->getCOM(com);
163    
164     for(cutoffAtom = myCutoffGroup->beginAtom(iterAtom); cutoffAtom != NULL;
165     cutoffAtom = myCutoffGroup->beginAtom(iterAtom)){
166     cutoffAtom->setRc(com);
167     }
168    
169     }// end for(myCutoffGroup)
170    
171     }//end for(int i = 0)
172    
173     rc = config->getRcArray();
174     }
175     else{
176     // center of mass of the group is the same as position of the atom if cutoff group does not exist
177     rc = pos;
178     }
179    
180    
181    
182 mmeineke 377 isError = 0;
183     entry_plug->lrPot = 0.0;
184 mmeineke 393
185 chuckv 479 for (i=0; i<9; i++) {
186     entry_plug->tau[i] = 0.0;
187     }
188 chuckv 438
189 mmeineke 841
190 chuckv 892 #ifdef PROFILE
191     startProfile(pro8);
192     #endif
193    
194 mmeineke 377 fortranForceLoop( pos,
195 tim 1142 rc,
196 mmeineke 377 A,
197     u_l,
198     frc,
199     trq,
200 chuckv 479 entry_plug->tau,
201 mmeineke 377 &(entry_plug->lrPot),
202     &passedCalcPot,
203     &passedCalcStress,
204     &isError );
205    
206 tim 1136
207 chuckv 892 #ifdef PROFILE
208     endProfile(pro8);
209     #endif
210 mmeineke 841
211    
212 mmeineke 377 if( isError ){
213     sprintf( painCave.errMsg,
214     "Error returned from the fortran force calculation.\n" );
215     painCave.isFatal = 1;
216     simError();
217     }
218    
219 gezelter 1097 for(i=0; i<entry_plug->n_mol; i++ ){
220     entry_plug->molecules[i].atoms2rigidBodies();
221     }
222    
223    
224 mmeineke 377 #ifdef IS_MPI
225     sprintf( checkPointMsg,
226     "returned from the force calculation.\n" );
227     MPIcheckPoint();
228     #endif // is_mpi
229 mmeineke 597
230 mmeineke 377
231     }
232    
233    
234     void ForceFields::initFortran(int ljMixPolicy, int useReactionField ){
235    
236     int isError;
237    
238     isError = 0;
239     initFortranFF( &ljMixPolicy, &useReactionField, &isError );
240    
241     if(isError){
242     sprintf( painCave.errMsg,
243     "ForceField error: There was an error initializing the forceField in fortran.\n" );
244     painCave.isFatal = 1;
245     simError();
246     }
247    
248    
249     #ifdef IS_MPI
250     sprintf( checkPointMsg, "ForceField successfully initialized the fortran component list.\n" );
251     MPIcheckPoint();
252     #endif // is_mpi
253    
254     }