ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ForceFields.cpp
(Generate patch)

Comparing:
branches/mmeineke/OOPSE/libmdtools/ForceFields.cpp (file contents), Revision 377 by mmeineke, Fri Mar 21 17:42:12 2003 UTC vs.
trunk/OOPSE/libmdtools/ForceFields.cpp (file contents), Revision 1150 by gezelter, Fri May 7 21:35:05 2004 UTC

# Line 1 | Line 1
1 < #include <cstdlib>
1 > #include <iostream>
2  
3 + using namespace std;
4 +
5 +
6 + #include <stdlib.h>
7 +
8   #ifdef IS_MPI
9   #include <mpi.h>
10   #endif // is_mpi
11  
12  
13 + #ifdef PROFILE
14 + #include "mdProfile.hpp"
15 + #endif
16 +
17   #include "simError.h"
18   #include "ForceFields.hpp"
19   #include "Atom.hpp"
20   #include "fortranWrappers.hpp"
21  
22  
23 + void ForceFields::calcRcut( void ){
24 +
25 + #ifdef IS_MPI
26 +  double tempBig = bigSigma;
27 +  MPI_Allreduce( &tempBig, &bigSigma, 1, MPI_DOUBLE, MPI_MAX,
28 +                 MPI_COMM_WORLD);
29 + #endif  //is_mpi
30 +
31 +  //calc rCut and rList
32 +
33 +  entry_plug->setDefaultRcut( 2.5 * bigSigma );  
34 +    
35 + }
36 +
37 + 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   void ForceFields::doForces( int calcPot, int calcStress ){
75  
76    int i, isError;
77    double* frc;
78    double* pos;
79    double* trq;
20  double* tau;
80    double* A;
81    double* u_l;
82 +  double* rc;
83 +  double* massRatio;
84 +  SimState* config;
85  
86    short int passedCalcPot = (short int)calcPot;
87    short int passedCalcStress = (short int)calcStress;
88  
89 <  // forces are zeroed here, before any are acumulated.
89 >  // forces are zeroed here, before any are accumulated.
90    // NOTE: do not rezero the forces in Fortran.
91  
92    for(i=0; i<entry_plug->n_atoms; i++){
93 <    entry_plug->atoms[i]->zeroForces();
93 >    entry_plug->atoms[i]->zeroForces();    
94    }
95  
96 <  frc = Atom::getFrcArray();
97 <  pos = Atom::getPosArray();
98 <  trq = Atom::getTrqArray();
99 <  A   = Atom::getAmatArray();
100 <  u_l = Atom::getUlArray();
96 > #ifdef PROFILE
97 >  startProfile(pro7);
98 > #endif
99 >  
100 >  for(i=0; i<entry_plug->n_mol; i++ ){
101 >    // CalcForces in molecules takes care of mapping rigid body coordinates
102 >    // into atomic coordinates
103 >    entry_plug->molecules[i].calcForces();    
104 >  }
105  
106 <  tau = entry_plug->tau;
107 <    
106 > #ifdef PROFILE
107 >  endProfile( pro7 );
108 > #endif
109 >
110 >  config = entry_plug->getConfiguration();
111 >  
112 >  frc = config->getFrcArray();
113 >  pos = config->getPosArray();
114 >  trq = config->getTrqArray();
115 >  A   = config->getAmatArray();
116 >  u_l = config->getUlArray();
117 >  rc  = config->getRcArray();
118 >  massRatio = config->getMassRatioArray();
119 >
120    isError = 0;
121    entry_plug->lrPot = 0.0;
122 +
123 +  for (i=0; i<9; i++) {
124 +    entry_plug->tau[i] = 0.0;
125 +  }
126 +
127 +
128 + #ifdef PROFILE
129 +  startProfile(pro8);
130 + #endif
131 +
132    fortranForceLoop( pos,
133 +                    rc,
134                      A,
135                      u_l,
136                      frc,
137                      trq,
138 <                    tau,
138 >                    entry_plug->tau,
139                      &(entry_plug->lrPot),
140                      &passedCalcPot,
141                      &passedCalcStress,
142                      &isError );
143  
144  
145 + #ifdef PROFILE
146 +  endProfile(pro8);
147 + #endif
148 +
149 +
150    if( isError ){
151      sprintf( painCave.errMsg,
152               "Error returned from the fortran force calculation.\n" );
# Line 60 | Line 154 | void ForceFields::doForces( int calcPot, int calcStres
154      simError();
155    }
156  
157 +  for(i=0; i<entry_plug->n_mol; i++ ){
158 +    entry_plug->molecules[i].atoms2rigidBodies();
159 +  }
160 +
161 +
162   #ifdef IS_MPI
163    sprintf( checkPointMsg,
164             "returned from the force calculation.\n" );
165    MPIcheckPoint();
166   #endif // is_mpi
167 +  
168  
169   }
170  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines