ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/simpleBuilder/simpleBuilder.cpp
Revision: 2204
Committed: Fri Apr 15 22:04:00 2005 UTC (19 years, 3 months ago) by gezelter
File size: 8738 byte(s)
Log Message:
xemacs has been drafted to perform our indentation services

File Contents

# User Rev Content
1 gezelter 2204 /*
2 gezelter 1930 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9     * 1. Acknowledgement of the program authors must be made in any
10     * publication of scientific results based in part on use of the
11     * program. An acceptable form of acknowledgement is citation of
12     * the article in which the program was described (Matthew
13     * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14     * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15     * Parallel Simulation Engine for Molecular Dynamics,"
16     * J. Comput. Chem. 26, pp. 252-271 (2005))
17     *
18     * 2. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42 tim 1501 #include <cstdlib>
43     #include <cstdio>
44     #include <cstring>
45     #include <cmath>
46     #include <iostream>
47     #include <string>
48     #include <map>
49     #include <fstream>
50    
51     #include "applications/simpleBuilder/simpleBuilderCmd.h"
52 gezelter 2178 #include "lattice/LatticeFactory.hpp"
53     #include "utils/MoLocator.hpp"
54     #include "lattice/Lattice.hpp"
55 gezelter 1930 #include "brains/Register.hpp"
56     #include "brains/SimInfo.hpp"
57     #include "brains/SimCreator.hpp"
58     #include "io/DumpWriter.hpp"
59     #include "math/Vector3.hpp"
60     #include "math/SquareMatrix3.hpp"
61     #include "utils/StringUtils.hpp"
62 tim 1501
63     using namespace std;
64 gezelter 1930 using namespace oopse;
65     void createMdFile(const std::string&oldMdFileName, const std::string&newMdFileName,
66     int numMol);
67 tim 1501
68 gezelter 1930 int main(int argc, char *argv []) {
69 tim 1501
70 gezelter 2204 //register force fields
71     registerForceFields();
72     registerLattice();
73 gezelter 1930
74 gezelter 2204 gengetopt_args_info args_info;
75     std::string latticeType;
76     std::string inputFileName;
77     std::string outPrefix;
78     std::string outMdFileName;
79     std::string outInitFileName;
80     Lattice *simpleLat;
81     int numMol;
82     double latticeConstant;
83     std::vector<double> lc;
84     double mass;
85     const double rhoConvertConst = 1.661;
86     double density;
87     int nx,
88 gezelter 1930 ny,
89     nz;
90 gezelter 2204 Mat3x3d hmat;
91     MoLocator *locator;
92     std::vector<Vector3d> latticePos;
93     std::vector<Vector3d> latticeOrt;
94     int numMolPerCell;
95     int curMolIndex;
96     DumpWriter *writer;
97 tim 1501
98 gezelter 2204 // parse command line arguments
99     if (cmdline_parser(argc, argv, &args_info) != 0)
100     exit(1);
101 tim 1501
102 gezelter 2204 density = args_info.density_arg;
103 tim 1501
104 gezelter 2204 //get lattice type
105     latticeType = UpperCase(args_info.latticetype_arg);
106 tim 1501
107 gezelter 2204 simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
108 tim 2184
109 gezelter 2204 if (simpleLat == NULL) {
110     sprintf(painCave.errMsg, "Lattice Factory can not create %s lattice\n",
111     latticeType.c_str());
112     painCave.isFatal = 1;
113     simError();
114     }
115 tim 1501
116 gezelter 2204 //get the number of unit cell
117     nx = args_info.nx_arg;
118 tim 1501
119 gezelter 2204 if (nx <= 0) {
120     std::cerr << "The number of unit cell in h direction must be greater than 0" << std::endl;
121     exit(1);
122     }
123 tim 1501
124 gezelter 2204 ny = args_info.ny_arg;
125 tim 1501
126 gezelter 2204 if (ny <= 0) {
127     std::cerr << "The number of unit cell in l direction must be greater than 0" << std::endl;
128     exit(1);
129     }
130 tim 1501
131 gezelter 2204 nz = args_info.nz_arg;
132 tim 1501
133 gezelter 2204 if (nz <= 0) {
134     std::cerr << "The number of unit cell in k direction must be greater than 0" << std::endl;
135     exit(1);
136     }
137 tim 1501
138 gezelter 2204 //get input file name
139     if (args_info.inputs_num)
140     inputFileName = args_info.inputs[0];
141     else {
142     std::cerr << "You must specify a input file name.\n" << std::endl;
143     cmdline_parser_print_help();
144     exit(1);
145     }
146 tim 1501
147 gezelter 2204 //parse md file and set up the system
148     SimCreator oldCreator;
149     SimInfo* oldInfo = oldCreator.createSim(inputFileName, false);
150 tim 1501
151 gezelter 2204 if (oldInfo->getNMoleculeStamp()>= 2) {
152     std::cerr << "can not build the system with more than two components"
153     << std::endl;
154     exit(1);
155     }
156 tim 1501
157 gezelter 2204 //get mass of molecule.
158 tim 1501
159 gezelter 2204 mass = getMolMass(oldInfo->getMoleculeStamp(0), oldInfo->getForceField());
160 tim 1501
161 gezelter 2204 //creat lattice
162     simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
163 tim 1501
164 gezelter 2204 if (simpleLat == NULL) {
165     std::cerr << "Error in creating lattice" << std::endl;
166     exit(1);
167     }
168 tim 1501
169 gezelter 2204 numMolPerCell = simpleLat->getNumSitesPerCell();
170 tim 1501
171 gezelter 2204 //calculate lattice constant (in Angstrom)
172     latticeConstant = pow(rhoConvertConst * numMolPerCell * mass / density,
173     1.0 / 3.0);
174 tim 1501
175 gezelter 2204 //set lattice constant
176     lc.push_back(latticeConstant);
177     simpleLat->setLatticeConstant(lc);
178 tim 1501
179 gezelter 2204 //calculate the total number of molecules
180     numMol = nx * ny * nz * numMolPerCell;
181 tim 1501
182 gezelter 2204 if (oldInfo->getNGlobalMolecules() != numMol) {
183     outPrefix = getPrefix(inputFileName.c_str()) + "_" + latticeType;
184     outMdFileName = outPrefix + ".md";
185 gezelter 1930
186 gezelter 2204 //creat new .md file on fly which corrects the number of molecule
187     createMdFile(inputFileName, outMdFileName, numMol);
188     std::cerr
189     << "SimpleBuilder Error: the number of molecule and the density are not matched"
190     << std::endl;
191     std::cerr << "A new .md file: " << outMdFileName
192     << " is generated, use it to rerun the simpleBuilder" << std::endl;
193     exit(1);
194     }
195 tim 1501
196 gezelter 2204 //determine the output file names
197     if (args_info.output_given)
198     outInitFileName = args_info.output_arg;
199     else
200     outInitFileName = getPrefix(inputFileName.c_str()) + ".in";
201 gezelter 1930
202 gezelter 2204 //creat Molocator
203     locator = new MoLocator(oldInfo->getMoleculeStamp(0), oldInfo->getForceField());
204 tim 1501
205 gezelter 2204 //fill Hmat
206     hmat(0, 0)= nx * latticeConstant;
207     hmat(0, 1) = 0.0;
208     hmat(0, 2) = 0.0;
209 tim 1501
210 gezelter 2204 hmat(1, 0) = 0.0;
211     hmat(1, 1) = ny * latticeConstant;
212     hmat(1, 2) = 0.0;
213 tim 1501
214 gezelter 2204 hmat(2, 0) = 0.0;
215     hmat(2, 1) = 0.0;
216     hmat(2, 2) = nz * latticeConstant;
217 tim 1501
218 gezelter 2204 //set Hmat
219     oldInfo->getSnapshotManager()->getCurrentSnapshot()->setHmat(hmat);
220 tim 1501
221 gezelter 2204 //place the molecules
222 gezelter 1930
223 gezelter 2204 curMolIndex = 0;
224 gezelter 1930
225 gezelter 2204 //get the orientation of the cell sites
226     //for the same type of molecule in same lattice, it will not change
227     latticeOrt = simpleLat->getLatticePointsOrt();
228 gezelter 1930
229 gezelter 2204 Molecule* mol;
230     SimInfo::MoleculeIterator mi;
231     mol = oldInfo->beginMolecule(mi);
232     for(int i = 0; i < nx; i++) {
233     for(int j = 0; j < ny; j++) {
234     for(int k = 0; k < nz; k++) {
235 gezelter 1930
236 gezelter 2204 //get the position of the cell sites
237     simpleLat->getLatticePointsPos(latticePos, i, j, k);
238 gezelter 1930
239 gezelter 2204 for(int l = 0; l < numMolPerCell; l++) {
240     if (mol != NULL) {
241     locator->placeMol(latticePos[l], latticeOrt[l], mol);
242     } else {
243     std::cerr << std::endl;
244     }
245     mol = oldInfo->nextMolecule(mi);
246     }
247     }
248 tim 1501 }
249 gezelter 2204 }
250 tim 1501
251 gezelter 2204 //create dumpwriter and write out the coordinates
252     oldInfo->setFinalConfigFileName(outInitFileName);
253     writer = new DumpWriter(oldInfo);
254 tim 1501
255 gezelter 2204 if (writer == NULL) {
256     std::cerr << "error in creating DumpWriter" << std::endl;
257     exit(1);
258     }
259 tim 1501
260 gezelter 2204 writer->writeDump();
261     std::cout << "new initial configuration file: " << outInitFileName
262     << " is generated." << std::endl;
263 gezelter 1930
264 gezelter 2204 //delete objects
265 gezelter 1930
266 gezelter 2204 //delete oldInfo and oldSimSetup
267     if (oldInfo != NULL)
268     delete oldInfo;
269 gezelter 1930
270 gezelter 2204 if (writer != NULL)
271     delete writer;
272 tim 2185
273 gezelter 2204 delete simpleLat;
274 gezelter 1930
275 gezelter 2204 return 0;
276 tim 1501 }
277    
278 gezelter 1930 void createMdFile(const std::string&oldMdFileName, const std::string&newMdFileName,
279     int numMol) {
280 gezelter 2204 ifstream oldMdFile;
281     ofstream newMdFile;
282     const int MAXLEN = 65535;
283     char buffer[MAXLEN];
284 tim 1501
285 gezelter 2204 //create new .md file based on old .md file
286     oldMdFile.open(oldMdFileName.c_str());
287     newMdFile.open(newMdFileName.c_str());
288 tim 1501
289 gezelter 2204 oldMdFile.getline(buffer, MAXLEN);
290 gezelter 1930
291 gezelter 2204 while (!oldMdFile.eof()) {
292 gezelter 1930
293 gezelter 2204 //correct molecule number
294     if (strstr(buffer, "nMol") != NULL) {
295     sprintf(buffer, "\t\tnMol = %d;", numMol);
296     newMdFile << buffer << std::endl;
297     } else
298     newMdFile << buffer << std::endl;
299 gezelter 1930
300 gezelter 2204 oldMdFile.getline(buffer, MAXLEN);
301     }
302 gezelter 1930
303 gezelter 2204 oldMdFile.close();
304     newMdFile.close();
305 tim 1501 }
306 gezelter 1930