ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/randomBuilder/randomBuilder.cpp
Revision: 2071
Committed: Sat Mar 7 21:41:51 2015 UTC (10 years, 1 month ago) by gezelter
File size: 11662 byte(s)
Log Message:
Reducing the number of warnings when using g++ to compile.

File Contents

# Content
1 /* Copyright (c) 2006 The University of Notre Dame. All Rights Reserved.
2 *
3 * The University of Notre Dame grants you ("Licensee") a
4 * non-exclusive, royalty free, license to use, modify and
5 * redistribute this software in source and binary code form, provided
6 * that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
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.
15 *
16 * This software is provided "AS IS," without a warranty of any
17 * kind. All express or implied conditions, representations and
18 * warranties, including any implied warranty of merchantability,
19 * fitness for a particular purpose or non-infringement, are hereby
20 * excluded. The University of Notre Dame and its licensors shall not
21 * be liable for any damages suffered by licensee as a result of
22 * using, modifying or distributing the software or its
23 * derivatives. In no event will the University of Notre Dame or its
24 * licensors be liable for any lost revenue, profit or data, or for
25 * direct, indirect, special, consequential, incidental or punitive
26 * damages, however caused and regardless of the theory of liability,
27 * arising out of the use of or inability to use software, even if the
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$
46 *
47 */
48
49
50 #include <cstdlib>
51 #include <cstdio>
52 #include <cstring>
53 #include <cmath>
54 #include <iostream>
55 #include <string>
56 #include <map>
57 #include <fstream>
58
59 #include "applications/randomBuilder/randomBuilderCmd.h"
60 #include "lattice/LatticeFactory.hpp"
61 #include "utils/MoLocator.hpp"
62 #include "lattice/Lattice.hpp"
63 #include "brains/Register.hpp"
64 #include "brains/SimInfo.hpp"
65 #include "brains/SimCreator.hpp"
66 #include "io/DumpWriter.hpp"
67 #include "math/Vector3.hpp"
68 #include "math/SquareMatrix3.hpp"
69 #include "utils/StringUtils.hpp"
70
71 using namespace std;
72 using namespace OpenMD;
73
74 void createMdFile(const std::string&oldMdFileName,
75 const std::string&newMdFileName,
76 std::vector<int> nMol);
77
78 int main(int argc, char *argv []) {
79
80 registerLattice();
81
82 gengetopt_args_info args_info;
83 std::string latticeType;
84 std::string inputFileName;
85 std::string outputFileName;
86 Lattice *simpleLat;
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 nMolPerCell;
97 DumpWriter *writer;
98
99 // parse command line arguments
100 if (cmdline_parser(argc, argv, &args_info) != 0)
101 exit(1);
102
103 density = args_info.density_arg;
104
105 //get lattice type
106 latticeType = "FCC";
107
108 simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
109
110 if (simpleLat == NULL) {
111 sprintf(painCave.errMsg, "Lattice Factory can not create %s lattice\n",
112 latticeType.c_str());
113 painCave.isFatal = 1;
114 simError();
115 }
116 nMolPerCell = simpleLat->getNumSitesPerCell();
117
118 //get the number of unit cells in each direction:
119
120 nx = args_info.nx_arg;
121
122 if (nx <= 0) {
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 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 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 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 // Calculate lattice constant (in Angstroms)
166
167 std::vector<Component*> components = simParams->getComponents();
168 std::vector<RealType> molFractions;
169 std::vector<RealType> molecularMasses;
170 std::vector<int> nMol;
171 std::size_t nComponents = components.size();
172
173 if (nComponents == 1) {
174 molFractions.push_back(1.0);
175 } else {
176 if (args_info.molFraction_given == nComponents) {
177 for (std::size_t 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 (std::size_t 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 // do some sanity checking:
196
197 RealType totalFraction = 0.0;
198
199 for (std::size_t 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 int remaining = nSites;
221 for (std::size_t 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 // recompute actual mol fractions and perform final sanity check:
228
229 int totalMolecules = 0;
230 RealType totalMass = 0.0;
231 for (std::size_t 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 // Get the standard orientations of the cell sites
258
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
269
270 simpleLat->getLatticePointsPos(latticePos, i, j, k);
271
272 for(int l = 0; l < nMolPerCell; l++) {
273 sites.push_back(latticePos[l]);
274 orientations.push_back(latticeOrt[l]);
275 }
276 }
277 }
278 }
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, 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 SimCreator newCreator;
292 SimInfo* newInfo = newCreator.createSim(outputFileName, false);
293
294 // fill Hmat
295
296 hmat(0, 0) = nx * latticeConstant;
297 hmat(0, 1) = 0.0;
298 hmat(0, 2) = 0.0;
299
300 hmat(1, 0) = 0.0;
301 hmat(1, 1) = ny * latticeConstant;
302 hmat(1, 2) = 0.0;
303
304 hmat(2, 0) = 0.0;
305 hmat(2, 1) = 0.0;
306 hmat(2, 2) = nz * latticeConstant;
307
308 // Set Hmat
309
310 newInfo->getSnapshotManager()->getCurrentSnapshot()->setHmat(hmat);
311
312 // place the molecules
313
314 // Randomize a vector of ints:
315
316 vector<int> ids;
317 for (std::size_t i = 0; i < sites.size(); i++) ids.push_back(i);
318 std::random_shuffle(ids.begin(), ids.end());
319
320 Molecule* mol;
321 int l = 0;
322 for (std::size_t 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
336 if (writer == NULL) {
337 sprintf(painCave.errMsg, "error in creating DumpWriter");
338 painCave.isFatal = 1;
339 simError();
340 }
341
342 writer->writeDump();
343
344 // deleting the writer will put the closing at the end of the dump file.
345
346 delete writer;
347
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 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 std::size_t i = 0;
372 while (!oldMdFile.eof()) {
373
374 //correct molecule number
375 if (strstr(buffer, "nMol") != NULL) {
376 if (i<nMol.size()){
377 sprintf(buffer, "\tnMol = %i;", nMol.at(i));
378 newMdFile << buffer << std::endl;
379 i++;
380 }
381 } else
382 newMdFile << buffer << std::endl;
383
384 oldMdFile.getline(buffer, MAXLEN);
385 }
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

Properties

Name Value
svn:keywords Author Id Revision Date