ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ForceFields.cpp
Revision: 1142
Committed: Thu Apr 29 02:11:49 2004 UTC (20 years, 2 months ago) by tim
File size: 4236 byte(s)
Log Message:
fix an unmatched c/fortran interface

File Contents

# Content
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;
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 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();
94 }
95
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 #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 massRatio,
135 A,
136 u_l,
137 frc,
138 trq,
139 entry_plug->tau,
140 &(entry_plug->lrPot),
141 &passedCalcPot,
142 &passedCalcStress,
143 &isError );
144
145
146 #ifdef PROFILE
147 endProfile(pro8);
148 #endif
149
150
151 if( isError ){
152 sprintf( painCave.errMsg,
153 "Error returned from the fortran force calculation.\n" );
154 painCave.isFatal = 1;
155 simError();
156 }
157
158 for(i=0; i<entry_plug->n_mol; i++ ){
159 entry_plug->molecules[i].atoms2rigidBodies();
160 }
161
162
163 #ifdef IS_MPI
164 sprintf( checkPointMsg,
165 "returned from the force calculation.\n" );
166 MPIcheckPoint();
167 #endif // is_mpi
168
169
170 }
171
172
173 void ForceFields::initFortran(int ljMixPolicy, int useReactionField ){
174
175 int isError;
176
177 isError = 0;
178 initFortranFF( &ljMixPolicy, &useReactionField, &isError );
179
180 if(isError){
181 sprintf( painCave.errMsg,
182 "ForceField error: There was an error initializing the forceField in fortran.\n" );
183 painCave.isFatal = 1;
184 simError();
185 }
186
187
188 #ifdef IS_MPI
189 sprintf( checkPointMsg, "ForceField successfully initialized the fortran component list.\n" );
190 MPIcheckPoint();
191 #endif // is_mpi
192
193 }