ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/randomBuilder/randomBuilder.cpp
(Generate patch)

Comparing trunk/src/applications/randomBuilder/randomBuilder.cpp (file contents):
Revision 1062 by gezelter, Tue Oct 10 02:44:13 2006 UTC vs.
Revision 1978 by gezelter, Thu Mar 13 13:03:11 2014 UTC

# Line 5 | Line 5
5   * redistribute this software in source and binary code form, provided
6   * that the following conditions are met:
7   *
8 < * 1. Acknowledgement of the program authors must be made in any
9 < *    publication of scientific results based in part on use of the
10 < *    program.  An acceptable form of acknowledgement is citation of
11 < *    the article in which the program was described (Matthew
12 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
13 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
14 < *    Parallel Simulation Engine for Molecular Dynamics,"
15 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
16 < *
17 < * 2. Redistributions of source code must retain the above copyright
8 > * 1. Redistributions of source code must retain the above copyright
9   *    notice, this list of conditions and the following disclaimer.
10   *
11 < * 3. Redistributions in binary form must reproduce the above copyright
11 > * 2. Redistributions in binary form must reproduce the above copyright
12   *    notice, this list of conditions and the following disclaimer in the
13   *    documentation and/or other materials provided with the
14   *    distribution.
# Line 37 | Line 28
28   * University of Notre Dame has been advised of the possibility of
29   * such damages.
30   *
31 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
32 + * research, please cite the appropriate papers when you publish your
33 + * work.  Good starting points are:
34 + *                                                                      
35 + * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
36 + * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
37 + * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
38 + * [4] Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
39 + * [4] , Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). *
40   *
41   *  randomBuilder.cpp
42   *
43   *  Created by Charles F. Vardeman II on 10 Apr 2006.
44   *  @author  Charles F. Vardeman II
45 < *  @version $Id: randomBuilder.cpp,v 1.4 2006-10-10 02:44:13 gezelter Exp $
45 > *  @version $Id$
46   *
47   */
48  
# Line 69 | Line 69 | using namespace std;
69   #include "utils/StringUtils.hpp"
70  
71   using namespace std;
72 < using namespace oopse;
72 > using namespace OpenMD;
73  
74   void createMdFile(const std::string&oldMdFileName,
75                    const std::string&newMdFileName,
76 <                  int components, int* numMol);
76 >                  std::vector<int> nMol);
77  
78   int main(int argc, char *argv []) {
79  
80  // register force fields
81  registerForceFields();
80    registerLattice();
81      
82    gengetopt_args_info args_info;
# Line 86 | Line 84 | int main(int argc, char *argv []) {
84    std::string inputFileName;
85    std::string outputFileName;
86    Lattice *simpleLat;
89  int* numMol;
87    RealType latticeConstant;
88    std::vector<RealType> lc;
92  RealType mass;
89    const RealType rhoConvertConst = 1.661;
90    RealType density;
91    int nx, ny, nz;
# Line 97 | Line 93 | int main(int argc, char *argv []) {
93    MoLocator *locator;
94    std::vector<Vector3d> latticePos;
95    std::vector<Vector3d> latticeOrt;
96 <  int numMolPerCell;
101 <  int curMolIndex;
96 >  int nMolPerCell;
97    DumpWriter *writer;
98  
99    // parse command line arguments
# Line 108 | Line 103 | int main(int argc, char *argv []) {
103    density = args_info.density_arg;
104  
105    //get lattice type
106 <  latticeType = UpperCase(args_info.latticetype_arg);
106 >  latticeType = "FCC";
107  
108    simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
109      
# Line 118 | Line 113 | int main(int argc, char *argv []) {
113      painCave.isFatal = 1;
114      simError();
115    }
116 +  nMolPerCell = simpleLat->getNumSitesPerCell();
117  
118    //get the number of unit cells in each direction:
119  
# Line 148 | Line 144 | int main(int argc, char *argv []) {
144      simError();
145    }
146  
147 +  int nSites = nMolPerCell * nx * ny * nz;
148 +
149    //get input file name
150    if (args_info.inputs_num)
151      inputFileName = args_info.inputs[0];
# Line 164 | Line 162 | int main(int argc, char *argv []) {
162    SimInfo* oldInfo = oldCreator.createSim(inputFileName, false);
163    Globals* simParams = oldInfo->getSimParams();
164  
165 <  int nComponents =simParams->getNComponents();
168 <  if (oldInfo->getNMoleculeStamp() > 2) {
169 <    sprintf(painCave.errMsg, "randomBuilder can't yet build a system with "
170 <            "more than two components.");
171 <    painCave.isFatal = 1;
172 <    simError();
173 <  }
165 >  // Calculate lattice constant (in Angstroms)
166  
167 <  //get mass of molecule.
167 >  std::vector<Component*> components = simParams->getComponents();
168 >  std::vector<RealType> molFractions;
169 >  std::vector<RealType> molecularMasses;
170 >  std::vector<int> nMol;
171 >  int nComponents = components.size();
172  
173 <  mass = getMolMass(oldInfo->getMoleculeStamp(0), oldInfo->getForceField());
173 >  if (nComponents == 1) {
174 >    molFractions.push_back(1.0);    
175 >  } else {
176 >    if (args_info.molFraction_given == nComponents) {
177 >      for (int i = 0; i < nComponents; i++) {
178 >        molFractions.push_back(args_info.molFraction_arg[i]);
179 >      }
180 >    } else if (args_info.molFraction_given == nComponents-1) {
181 >      RealType remainingFraction = 1.0;
182 >      for (int i = 0; i < nComponents-1; i++) {
183 >        molFractions.push_back(args_info.molFraction_arg[i]);
184 >        remainingFraction -= molFractions[i];
185 >      }
186 >      molFractions.push_back(remainingFraction);
187 >    } else {    
188 >      sprintf(painCave.errMsg, "randomBuilder can't figure out molFractions "
189 >              "for all of the components in the <MetaData> block.");
190 >      painCave.isFatal = 1;
191 >      simError();
192 >    }
193 >  }
194  
195 <  // Create the lattice
195 >  // do some sanity checking:
196 >  
197 >  RealType totalFraction = 0.0;
198  
199 <  simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
200 <
201 <  if (simpleLat == NULL) {
202 <    sprintf(painCave.errMsg, "Error in creating lattice.");
199 >  for (int i = 0; i < nComponents; i++) {
200 >    if (molFractions.at(i) < 0.0) {
201 >      sprintf(painCave.errMsg, "One of the requested molFractions was"
202 >              " less than zero!");
203 >      painCave.isFatal = 1;
204 >      simError();
205 >    }
206 >    if (molFractions.at(i) > 1.0) {
207 >      sprintf(painCave.errMsg, "One of the requested molFractions was"
208 >              " greater than one!");
209 >      painCave.isFatal = 1;
210 >      simError();
211 >    }
212 >    totalFraction += molFractions.at(i);
213 >  }
214 >  if (abs(totalFraction - 1.0) > 1e-6) {
215 >    sprintf(painCave.errMsg, "The sum of molFractions was not close enough to 1.0");
216      painCave.isFatal = 1;
217      simError();
218    }
219  
220 <  numMolPerCell = simpleLat->getNumSitesPerCell();
220 >  int remaining = nSites;
221 >  for (int i=0; i < nComponents-1; i++) {    
222 >    nMol.push_back(int((RealType)nSites * molFractions.at(i)));
223 >    remaining -= nMol.at(i);
224 >  }
225 >  nMol.push_back(remaining);
226  
227 <  // Calculate lattice constant (in Angstroms)
227 >  // recompute actual mol fractions and perform final sanity check:
228  
229 <  latticeConstant = pow(rhoConvertConst * numMolPerCell * mass / density,
230 <                        (RealType)(1.0 / 3.0));
229 >  int totalMolecules = 0;
230 >  RealType totalMass = 0.0;
231 >  for (int i=0; i < nComponents; i++) {
232 >    molFractions[i] = (RealType)(nMol.at(i))/(RealType)nSites;
233 >    totalMolecules += nMol.at(i);
234 >    molecularMasses.push_back(MoLocator::getMolMass(oldInfo->getMoleculeStamp(i),
235 >                                                    oldInfo->getForceField()));
236 >    totalMass += (RealType)(nMol.at(i)) * molecularMasses.at(i);
237 >  }
238 >  RealType avgMass = totalMass / (RealType) totalMolecules;
239  
240 +  if (totalMolecules != nSites) {
241 +    sprintf(painCave.errMsg, "Computed total number of molecules is not equal "
242 +            "to the number of lattice sites!");
243 +    painCave.isFatal = 1;
244 +    simError();
245 +  }
246 +    
247 +  latticeConstant = pow(rhoConvertConst * nMolPerCell * avgMass / density,
248 +                        (RealType)(1.0 / 3.0));
249 +  
250    // Set the lattice constant
251 <
251 >  
252    lc.push_back(latticeConstant);
253    simpleLat->setLatticeConstant(lc);
254 <
201 <  // Calculate the total number of molecules
202 <
203 <  int totMol = nx * ny * nz * numMolPerCell;
204 <
254 >  
255    // Calculate the lattice sites and fill the lattice vector.
256  
257    // Get the standard orientations of the cell sites
# Line 219 | Line 269 | int main(int argc, char *argv []) {
269  
270          simpleLat->getLatticePointsPos(latticePos, i, j, k);
271  
272 <        for(int l = 0; l < numMolPerCell; l++) {
272 >        for(int l = 0; l < nMolPerCell; l++) {
273            sites.push_back(latticePos[l]);
274            orientations.push_back(latticeOrt[l]);
275          }
276        }
277      }
278    }
229
230  int numSites = sites.size();
231
232  numMol = new int[nComponents];
233  if (nComponents != args_info.molFraction_given && nComponents != 1){
234    sprintf(painCave.errMsg, "There needs to be the same number of "
235            "molFraction arguments as there are components in the "
236            "<MetaData> block.");
237    painCave.isFatal = 1;
238    simError();
239  }
240  int totComponents = 0;
241  for (int i = 0;i<nComponents-1;i++){
242    numMol[i] = int((RealType)numSites * args_info.molFraction_arg[i]);
243    std::cout<<numMol[i]<<std::endl;
244    totComponents += numMol[i];
245  }
246  numMol[nComponents-1] = numSites - totComponents;
279    
280    outputFileName = args_info.output_arg;
281  
282    // create a new .md file on the fly which corrects the number of molecules
283  
284 <  createMdFile(inputFileName, outputFileName, nComponents, numMol);
284 >  createMdFile(inputFileName, outputFileName, nMol);
285  
286 <  if (oldInfo != NULL)
255 <    delete oldInfo;
286 >  delete oldInfo;
287  
288    // We need to read in the new SimInfo object, then Parse the
289    // md file and set up the system
# Line 280 | Line 311 | int main(int argc, char *argv []) {
311  
312    // place the molecules
313  
283  curMolIndex = 0;
284
314    // Randomize a vector of ints:
315  
316    vector<int> ids;
317 <  for (int i = 0; i < sites.size(); i++) ids.push_back(i);
317 >  for (unsigned int i = 0; i < sites.size(); i++) ids.push_back(i);
318    std::random_shuffle(ids.begin(), ids.end());
319  
320    Molecule* mol;
# Line 293 | Line 322 | int main(int argc, char *argv []) {
322    for (int i = 0; i < nComponents; i++){
323      locator = new MoLocator(newInfo->getMoleculeStamp(i),
324                              newInfo->getForceField());
325 <    for (int n = 0; n < numMol[i]; n++) {
325 >    for (int n = 0; n < nMol.at(i); n++) {
326        mol = newInfo->getMoleculeByGlobalIndex(l);
327        locator->placeMol(sites[ids[l]], orientations[ids[l]], mol);
328        l++;
# Line 316 | Line 345 | int main(int argc, char *argv []) {
345  
346    delete writer;
347  
348 <  sprintf(painCave.errMsg, "A new OOPSE MD file called \"%s\" has been "
349 <          "generated.", outputFileName.c_str());
348 >  sprintf(painCave.errMsg, "A new OpenMD file called \"%s\" has been "
349 >          "generated.\n", outputFileName.c_str());
350    painCave.isFatal = 0;
351 +  painCave.severity = OPENMD_INFO;
352    simError();
353    return 0;
354   }
355  
356   void createMdFile(const std::string&oldMdFileName,
357                    const std::string&newMdFileName,
358 <                  int components, int* numMol) {
358 >                  std::vector<int> nMol) {
359    ifstream oldMdFile;
360    ofstream newMdFile;
361    const int MAXLEN = 65535;
# Line 338 | Line 368 | void createMdFile(const std::string&oldMdFileName,
368    
369    oldMdFile.getline(buffer, MAXLEN);
370  
371 <  int i = 0;
371 >  unsigned int i = 0;
372    while (!oldMdFile.eof()) {
373      
374      //correct molecule number
375      if (strstr(buffer, "nMol") != NULL) {
376 <      if(i<components){
377 <        sprintf(buffer, "\tnMol = %i;", numMol[i]);
376 >      if (i<nMol.size()){
377 >        sprintf(buffer, "\tnMol = %i;", nMol.at(i));
378          newMdFile << buffer << std::endl;
379          i++;
380        }
# Line 356 | Line 386 | void createMdFile(const std::string&oldMdFileName,
386    
387    oldMdFile.close();
388    newMdFile.close();
389 +
390 +  if (i != nMol.size()) {
391 +    sprintf(painCave.errMsg, "Couldn't replace the correct number of nMol\n"
392 +            "\tstatements in component blocks.  Make sure that all\n"
393 +            "\tcomponents in the template file have nMol=1");
394 +    painCave.isFatal = 1;
395 +    simError();
396 +  }
397 +
398   }
399  

Comparing trunk/src/applications/randomBuilder/randomBuilder.cpp (property svn:keywords):
Revision 1062 by gezelter, Tue Oct 10 02:44:13 2006 UTC vs.
Revision 1978 by gezelter, Thu Mar 13 13:03:11 2014 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines