ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-1.0/utils/sysbuilder/simpleBuilder.cpp
(Generate patch)

Comparing trunk/OOPSE-1.0/utils/sysbuilder/simpleBuilder.cpp (file contents):
Revision 1429 by tim, Wed Jul 28 20:29:49 2004 UTC vs.
Revision 1436 by tim, Thu Jul 29 19:12:00 2004 UTC

# Line 20 | Line 20 | void createMdFile(const string& oldMdFileName, const s
20   using namespace std;
21  
22   void createMdFile(const string& oldMdFileName, const string& newMdFileName, int numMol);
23 + double getMolMass(MoleculeStamp* molStamp, ForceFields* myFF);
24  
25   int main( int argc, char* argv[]){
26  
# Line 30 | Line 31 | int main( int argc, char* argv[]){
31    string outMdFileName;
32    string outInitFileName;
33    SimInfo* oldInfo;
33  SimInfo* newInfo;
34    SimSetup* oldSimSetup;
35  SimSetup* newSimSetup;
35    BaseLattice* simpleLat;
36    int numMol;
37    double latticeConstant;
38    vector<double> lc;
39    double mass;
40 +  const double rhoConvertConst = 1.661;
41    double density;
42    int nx, ny, nz;
43    double Hmat[3][3];
# Line 47 | Line 47 | int main( int argc, char* argv[]){
47    int numMolPerCell;
48    int curMolIndex;
49    DumpWriter* writer;
50 <
50 >  
51    // parse command line arguments
52
52    if (cmdline_parser (argc, argv, &args_info) != 0)
53      exit(1) ;
54 +  
55 +  density = args_info.density_arg;
56  
57 <  if(!args_info.density_given && !args_info.ndensity_given){
57 <    cerr << "density or number density must be given" << endl;
58 <    return false;
59 <  }
60 <
57 >  //get lattice type
58    latticeType = UpperCase(args_info.latticetype_arg);
59    if(!LatticeFactory::getInstance()->hasLatticeCreator(latticeType)){
60      cerr << latticeType << " is an invalid lattice type" << endl;
61      cerr << LatticeFactory::getInstance()->toString() << endl;
62      exit(1);
63    }
64 <        
64 >
65 >  //get the number of unit cell
66    nx = args_info.nx_arg;
67    if(nx <= 0){
68      cerr << "The number of unit cell in h direction must be greater than 0" << endl;
# Line 92 | Line 90 | int main( int argc, char* argv[]){
90      exit(1);
91    }
92  
95  //determine the output file names
93    
97  if (args_info.output_given){
98    outPrefix = args_info.output_arg;
99  }
100  else
101    outPrefix = getPrefix(inputFileName.c_str()) + "_" + latticeType;
102  
103  outMdFileName = outPrefix + ".md";
104  outInitFileName = outPrefix + ".in";
105
94    //parse md file and set up the system
95    oldInfo = new SimInfo;
96    if(oldInfo == NULL){
# Line 115 | Line 103 | int main( int argc, char* argv[]){
103       cerr << "error in creating SimSetup" << endl;
104       exit(1);
105    }
106 <    
106 >
107 >  oldSimSetup->suspendInit();
108    oldSimSetup->setSimInfo(oldInfo );
109    oldSimSetup->parseFile(&inputFileName[0] );
110 <
111 <
110 >  oldSimSetup->createSim();
111 >  
112    if(oldInfo->nComponents >=2){
113        cerr << "can not build the system with more than two components" << endl;
114        exit(1);
115    }
116 <
116 >  
117 >  //get mass of molecule.
118 >  //Due to the design of OOPSE, given atom type, we have to query forcefiled to get the mass
119 >  mass = getMolMass(oldInfo->compStamps[0], oldSimSetup->getForceField());
120 >  
121    //creat lattice
122          simpleLat = LatticeFactory::getInstance()->createLattice(latticeType);
123          if(simpleLat == NULL){
# Line 132 | Line 125 | int main( int argc, char* argv[]){
125                  exit(1);
126          }
127  
135
128    numMolPerCell = simpleLat->getNumSitesPerCell();
137  //calculate lattice constant
138  latticeConstant = pow(numMolPerCell * mass /density, 1.0/3.0);
129    
130 +  //calculate lattice constant (in Angstrom)
131 +  latticeConstant = pow(rhoConvertConst * numMolPerCell * mass /density, 1.0/3.0);
132 +  
133    //set lattice constant
134    lc.push_back(latticeConstant);
135    simpleLat->setLatticeConstant(lc);
136    
137 <  //calculate the total
138 <  numMol = args_info.nx_arg * args_info.ny_arg * args_info.nz_arg * numMolPerCell;
137 >  //calculate the total number of molecules
138 >  numMol = nx * ny * nz * numMolPerCell;
139  
140 +  if (oldInfo->n_mol != numMol){
141 +
142 +    outPrefix = getPrefix(inputFileName.c_str()) + "_" + latticeType;
143 +    outMdFileName = outPrefix + ".md";
144 +
145 +    //creat new .md file on fly which corrects the number of molecule    
146 +    createMdFile(inputFileName, outMdFileName, numMol);
147 +    cerr << "SimpleBuilder Error: the number of molecule and the density are not matched" <<endl;
148 +    cerr << "A new .md file: " << outMdFileName << " is generated, use it to rerun the simpleBuilder" << endl;
149 +    exit(1);
150 +  }
151 +  
152 +  //determine the output file names  
153 +  if (args_info.output_given)
154 +    outInitFileName = args_info.output_arg;
155 +  else
156 +    outInitFileName = getPrefix(inputFileName.c_str())  + ".in";
157 +  
158 +  
159 +  //allocat memory for storing pos, vel and etc
160 +  oldInfo->getConfiguration()->createArrays(oldInfo->n_atoms);
161 +  for (int i = 0; i < oldInfo->n_atoms; i++)
162 +    oldInfo->atoms[i]->setCoords();  
163 +
164 +  //creat Molocator
165 +  locator = new MoLocator(oldInfo->compStamps[0], oldSimSetup->getForceField());
166 +
167    //fill Hmat
168    Hmat[0][0] = nx * latticeConstant;
169    Hmat[0][1] = 0.0;
170    Hmat[0][2] = 0.0;
171  
172 <  Hmat[1][0] = ny * latticeConstant;
173 <  Hmat[1][1] = 0.0;
172 >  Hmat[1][0] = 0.0;
173 >  Hmat[1][1] = ny * latticeConstant;
174    Hmat[1][2] = 0.0;
175  
176 <  Hmat[2][0] = nz * latticeConstant;
176 >  Hmat[2][0] = 0.0;
177    Hmat[2][1] = 0.0;
178 <  Hmat[2][2] = 0.0;
159 <  
160 <  //creat new .md file on fly
161 <  createMdFile(inputFileName, outMdFileName, numMol);
178 >  Hmat[2][2] = nz * latticeConstant ;
179  
163  //parse new .md file and set up the system
164  newInfo = new SimInfo;
165  if(newInfo == NULL){
166     cerr << "error in creating SimInfo" << endl;
167     exit(1);
168  }
169
170  newSimSetup = new SimSetup();  
171  if(newSimSetup == NULL){
172     cerr << "error in creating SimSetup" << endl;
173     exit(1);
174  }
175    
176  newSimSetup->setSimInfo(newInfo );
177  newSimSetup->parseFile(&outMdFileName[0] );
178  newSimSetup->createSim();
179
180    //set Hmat
181 <  newInfo->setBoxM(Hmat);
182 <
183 <  //allocat memory for storing pos, vel and etc
184 <  newInfo->getConfiguration()->createArrays(newInfo->n_atoms);
185 <  for (int i = 0; i < newInfo->n_atoms; i++)
186 <    newInfo->atoms[i]->setCoords();  
187 <
188 <  //creat Molocator
189 <  locator = new MoLocator(newInfo->compStamps[0], newSimSetup->getForceField());
190 <
181 >  oldInfo->setBoxM(Hmat);
182 >  
183    //place the molecules
184  
185    curMolIndex = 0;
# Line 204 | Line 196 | int main( int argc, char* argv[]){
196            simpleLat->getLatticePointsPos(latticePos, i, j, k);
197  
198            for(int l = 0; l < numMolPerCell; l++)
199 <            locator->placeMol(latticePos[l], latticeOrt[l], &(newInfo->molecules[curMolIndex++]));
199 >            locator->placeMol(latticePos[l], latticeOrt[l], &(oldInfo->molecules[curMolIndex++]));
200         }
201      }
202    }
203  
204    //create dumpwriter and write out the coordinates
205 <  writer = new DumpWriter( newInfo );
205 >  oldInfo->finalName = outInitFileName;
206 >  writer = new DumpWriter( oldInfo );
207    if(writer == NULL){
208      cerr << "error in creating DumpWriter" << endl;
209      exit(1);    
210    }
211    writer->writeFinal(0);
212 <
220 <  
212 >  cout << "new initial configuration file: " << outInitFileName <<" is generated." << endl;
213    //delete objects
214 <  if(!oldInfo)
214 >
215 >  //delete oldInfo and oldSimSetup
216 >  if(oldInfo != NULL)
217       delete oldInfo;
218    
219 <  if(!oldSimSetup)
220 <     delete oldSimSetup;
227 <
228 <  if(!newInfo)
229 <     delete newInfo;
219 >  if(oldSimSetup != NULL)
220 >     delete oldSimSetup;
221    
231  if(!newSimSetup)
232     delete newSimSetup;
233
222    if (writer != NULL)
223      delete writer;
224    return 0;
# Line 241 | Line 229 | void createMdFile(const string& oldMdFileName, const s
229    ofstream newMdFile;
230    const int MAXLEN = 65535;
231    char buffer[MAXLEN];
244  string line;
232  
233    //create new .md file based on old .md file
234    oldMdFile.open(oldMdFileName.c_str());
# Line 250 | Line 237 | void createMdFile(const string& oldMdFileName, const s
237    oldMdFile.getline(buffer, MAXLEN);
238    while(!oldMdFile.eof()){
239  
240 <    if(line.find("nMol") < line.size()){
241 <      
240 >    //correct molecule number
241 >    if(strstr(buffer, "nMol") !=NULL){      
242        sprintf(buffer, "\t\tnMol = %d;", numMol);
243        newMdFile << buffer << endl;
244      }
# Line 265 | Line 252 | void createMdFile(const string& oldMdFileName, const s
252    newMdFile.close();
253  
254   }
255 +
256 + double getMolMass(MoleculeStamp* molStamp, ForceFields* myFF){
257 +  int nAtoms;
258 +  AtomStamp* currAtomStamp;
259 +  double totMass;
260 +  
261 +  totMass = 0;
262 +  nAtoms = molStamp->getNAtoms();
263 +
264 +  for(size_t i=0; i<nAtoms; i++){
265 +    currAtomStamp = molStamp->getAtom(i);
266 +    totMass += myFF->getAtomTypeMass(currAtomStamp->getType());
267 +  }
268 +
269 +  return totMass;
270 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines