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 950 by chuckv, Tue Apr 25 22:59:27 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.1 2006-04-25 22:59:27 chuckv 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;
83    std::string latticeType;
84    std::string inputFileName;
85 <  std::string outPrefix;
88 <  std::string outMdFileName;
89 <  std::string outInitFileName;
85 >  std::string outputFileName;
86    Lattice *simpleLat;
87 <  int* numMol;
88 <  double latticeConstant;
89 <  std::vector<double> lc;
90 <  double mass;
91 <  const double rhoConvertConst = 1.661;
96 <  double density;
97 <  int nx,
98 <    ny,
99 <    nz;
87 >  RealType latticeConstant;
88 >  std::vector<RealType> lc;
89 >  const RealType rhoConvertConst = 1.661;
90 >  RealType density;
91 >  int nx, ny, nz;
92    Mat3x3d hmat;
93    MoLocator *locator;
94    std::vector<Vector3d> latticePos;
95    std::vector<Vector3d> latticeOrt;
96 <  int numMolPerCell;
105 <  int curMolIndex;
96 >  int nMolPerCell;
97    DumpWriter *writer;
98  
99    // parse command line arguments
# Line 112 | 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 122 | 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 cell
118 >  //get the number of unit cells in each direction:
119 >
120    nx = args_info.nx_arg;
121  
122    if (nx <= 0) {
123 <    std::cerr << "The number of unit cell in h direction must be greater than 0" << std::endl;
124 <    exit(1);
123 >    sprintf(painCave.errMsg, "The number of unit cells in the x direction "
124 >            "must be greater than 0.");
125 >    painCave.isFatal = 1;
126 >    simError();
127    }
128  
129    ny = args_info.ny_arg;
130  
131    if (ny <= 0) {
132 <    std::cerr << "The number of unit cell in l direction must be greater than 0" << std::endl;
133 <    exit(1);
132 >    sprintf(painCave.errMsg, "The number of unit cells in the y direction "
133 >            "must be greater than 0.");
134 >    painCave.isFatal = 1;
135 >    simError();
136    }
137  
138    nz = args_info.nz_arg;
139  
140    if (nz <= 0) {
141 <    std::cerr << "The number of unit cell in k direction must be greater than 0" << std::endl;
142 <    exit(1);
141 >    sprintf(painCave.errMsg, "The number of unit cells in the z direction "
142 >            "must be greater than 0.");
143 >    painCave.isFatal = 1;
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];
152    else {
153 <    std::cerr << "You must specify a input file name.\n" << std::endl;
154 <    cmdline_parser_print_help();
155 <    exit(1);
153 >    sprintf(painCave.errMsg, "No input .md file name was specified "
154 >            "on the command line");
155 >    painCave.isFatal = 1;
156 >    simError();
157    }
158  
159    //parse md file and set up the system
160 +
161    SimCreator oldCreator;
162    SimInfo* oldInfo = oldCreator.createSim(inputFileName, false);
163    Globals* simParams = oldInfo->getSimParams();
164  
165 <  int nComponents =simParams->getNComponents();
163 <  if (oldInfo->getNMoleculeStamp()>= 2) {
164 <    std::cerr << "can not build the system with more than two components"
165 <              << std::endl;
166 <    exit(1);
167 <  }
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 <  //creat lattice
196 <  simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
195 >  // do some sanity checking:
196 >  
197 >  RealType totalFraction = 0.0;
198  
199 <  if (simpleLat == NULL) {
200 <    std::cerr << "Error in creating lattice" << std::endl;
201 <    exit(1);
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 Angstrom)
184 <  latticeConstant = pow(rhoConvertConst * numMolPerCell * mass / density,
185 <                        1.0 / 3.0);
227 >  // recompute actual mol fractions and perform final sanity check:
228  
229 <  //set lattice constant
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 >  
252    lc.push_back(latticeConstant);
253    simpleLat->setLatticeConstant(lc);
254 +  
255 +  // Calculate the lattice sites and fill the lattice vector.
256  
257 <  //calculate the total number of molecules
192 <  int totMol = nx * ny * nz * numMolPerCell;
257 >  // Get the standard orientations of the cell sites
258  
259 <  // Calculate the lattice sites and fill lattice vector.
260 <  vector<Vector3d> latticeSites;
259 >  latticeOrt = simpleLat->getLatticePointsOrt();
260 >
261 >  vector<Vector3d> sites;
262 >  vector<Vector3d> orientations;
263    
264    for(int i = 0; i < nx; i++) {
265      for(int j = 0; j < ny; j++) {
266        for(int k = 0; k < nz; k++) {
267  
268 <        //get the position of the cell sites
268 >        // Get the position of the cell sites
269 >
270          simpleLat->getLatticePointsPos(latticePos, i, j, k);
271  
272 <        for(int l = 0; l < numMolPerCell; l++) {
273 <          latticeSites.push_back(latticePos[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    }
210
211  int numSites = latticeSites.size();
212
213  numMol = new int[nComponents];
214  if (nComponents != args_info.molFraction_given && nComponents != 1){
215    std::cerr << "Number of components does not equal molFraction occurances." << std::endl;
216    exit(1);
217  }
218  int totComponents = 0;
219  for (int i = 0;i<nComponents-1;i++){ /* Figure out Percent for each component */
220    numMol[i] = int((double)numSites * args_info.molFraction_arg[i]);
221    std::cout<<numMol[i]<<std::endl;
222    totComponents += numMol[i];
223  }
224  numMol[nComponents-1] = numSites - totComponents;
279    
280 +  outputFileName = args_info.output_arg;
281  
282 <  outPrefix = getPrefix(inputFileName.c_str()) + "_" + latticeType;
228 <  outMdFileName = outPrefix + ".md";
282 >  // create a new .md file on the fly which corrects the number of molecules
283  
284 <  //creat new .md file on fly which corrects the number of molecule    
231 <  createMdFile(inputFileName, outMdFileName, nComponents,numMol);
284 >  createMdFile(inputFileName, outputFileName, nMol);
285  
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
290  
291 <  //determine the output file names  
292 <  if (args_info.output_given){
237 <    outInitFileName = args_info.output_arg;
238 <  }else{
239 <    outInitFileName = getPrefix(inputFileName.c_str()) + ".in";
240 <  }
291 >  SimCreator newCreator;
292 >  SimInfo* newInfo = newCreator.createSim(outputFileName, false);
293  
294 <  //fill Hmat
295 <  hmat(0, 0)= nx * latticeConstant;
294 >  // fill Hmat
295 >
296 >  hmat(0, 0) = nx * latticeConstant;
297    hmat(0, 1) = 0.0;
298    hmat(0, 2) = 0.0;
299  
# Line 252 | Line 305 | int main(int argc, char *argv []) {
305    hmat(2, 1) = 0.0;
306    hmat(2, 2) = nz * latticeConstant;
307  
308 <  //set Hmat
256 <  oldInfo->getSnapshotManager()->getCurrentSnapshot()->setHmat(hmat);
308 >  // Set Hmat
309  
310 <  //place the molecules
310 >  newInfo->getSnapshotManager()->getCurrentSnapshot()->setHmat(hmat);
311  
312 <  curMolIndex = 0;
312 >  // place the molecules
313  
314 <  //get the orientation of the cell sites
263 <  //for the same type of molecule in same lattice, it will not change
264 <  latticeOrt = simpleLat->getLatticePointsOrt();
314 >  // Randomize a vector of ints:
315  
316 <
317 <  /* Randomize position vector */
318 <  std::random_shuffle(latticeSites.begin(), latticeSites.end());
316 >  vector<int> ids;
317 >  for (unsigned int i = 0; i < sites.size(); i++) ids.push_back(i);
318 >  std::random_shuffle(ids.begin(), ids.end());
319  
270
271  if (oldInfo != NULL)
272    delete oldInfo;
273  
274  
275  // We need to read in new siminfo object.    
276  //parse md file and set up the system
277  //SimCreator NewCreator;
278  SimCreator newCreator;
279  SimInfo* NewInfo = newCreator.createSim(outMdFileName, false);
280  
281  /* create Molocators */
282  locator = new MoLocator(NewInfo->getMoleculeStamp(0), NewInfo->getForceField());
283  
284  
285  
320    Molecule* mol;
287  SimInfo::MoleculeIterator mi;
288  mol = NewInfo->beginMolecule(mi);
321    int l = 0;
322 <  for (mol = NewInfo->beginMolecule(mi); mol != NULL; mol = NewInfo->nextMolecule(mi)) {
323 <    locator->placeMol(latticeSites[l], latticeOrt[l], mol);
324 <    l++;
322 >  for (int i = 0; i < nComponents; i++){
323 >    locator = new MoLocator(newInfo->getMoleculeStamp(i),
324 >                            newInfo->getForceField());
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++;
329 >    }
330    }
331 +  
332 +  // Create DumpWriter and write out the coordinates
333  
334 +  writer = new DumpWriter(newInfo, outputFileName);
335  
296
297  //create dumpwriter and write out the coordinates
298  oldInfo->setFinalConfigFileName(outInitFileName);
299  writer = new DumpWriter(oldInfo);
300
336    if (writer == NULL) {
337 <    std::cerr << "error in creating DumpWriter" << std::endl;
338 <    exit(1);
337 >    sprintf(painCave.errMsg, "error in creating DumpWriter");
338 >    painCave.isFatal = 1;
339 >    simError();
340    }
341  
342    writer->writeDump();
307  std::cout << "new initial configuration file: " << outInitFileName
308            << " is generated." << std::endl;
343  
344 <  //delete objects
344 >  // deleting the writer will put the closing at the end of the dump file.
345  
346 <  //delete oldInfo and oldSimSetup
313 <  if (oldInfo != NULL)
314 <    delete oldInfo;
346 >  delete writer;
347  
348 <  if (writer != NULL)
349 <    delete writer;
350 <    
351 <  delete simpleLat;
352 <
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, const std::string&newMdFileName,
357 <                  int components,int* numMol) {
356 > void createMdFile(const std::string&oldMdFileName,
357 >                  const std::string&newMdFileName,
358 >                  std::vector<int> nMol) {
359    ifstream oldMdFile;
360    ofstream newMdFile;
361    const int MAXLEN = 65535;
362    char buffer[MAXLEN];
363    
364    //create new .md file based on old .md file
365 +
366    oldMdFile.open(oldMdFileName.c_str());
367    newMdFile.open(newMdFileName.c_str());
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 352 | Line 386 | void createMdFile(const std::string&oldMdFileName, con
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 950 by chuckv, Tue Apr 25 22:59:27 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