ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-3.0/src/applications/dump2Xyz/Dump2XYZ.cpp
(Generate patch)

Comparing trunk/OOPSE-3.0/src/applications/dump2Xyz/Dump2XYZ.cpp (file contents):
Revision 1718 by chrisfen, Fri Nov 5 21:45:14 2004 UTC vs.
Revision 2097 by tim, Wed Mar 9 17:30:29 2005 UTC

# Line 1 | Line 1
1 + /*
2 + * 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   #include <iostream>
43   #include <fstream>
44   #include <string>
45  
5 #include "brains/SimSetup.hpp"
46   #include "applications/dump2Xyz/Dump2XYZCmd.h"
47 + #include "brains/Register.hpp"
48 + #include "brains/SimCreator.hpp"
49 + #include "brains/SimInfo.hpp"
50 + #include "io/DumpReader.hpp"
51 + #include "utils/simError.h"
52   #include "visitors/AtomVisitor.hpp"
53   #include "visitors/CompositeVisitor.hpp"
54   #include "visitors/RigidBodyVisitor.hpp"
55   #include "visitors/OtherVisitor.hpp"
56   #include "visitors/ZconsVisitor.hpp"
57 + #include "selection/SelectionEvaluator.hpp"
58 + #include "selection/SelectionManager.hpp"
59 + #include "visitors/LipidTransVisitor.hpp"
60  
61 < using namespace std;
61 > using namespace oopse;
62  
63   int main(int argc, char* argv[]){
16  gengetopt_args_info args_info;
17  string dumpFileName;
18  string mdFileName;
19  char inFileName[2002];
20  string xyzFileName;
21  SimInfo* info;
22  SimSetup startMe;
23  DumpReader* dumpReader;
24  ofstream xyzStream;
25  int nframes;
26  Molecule* mol;  
27  vector<StuntDouble*> integrableObjects;
28  vector<StuntDouble*>::iterator iter;
29  vector<RigidBody*> myRigidBodies;
30  vector<RigidBody*>::iterator rbIter;
64    
65 <  CompositeVisitor* compositeVisitor;
66 <  SSDAtomVisitor* ssdVisitor;
34 <  LinearAtomVisitor* linearVisitor;
35 <  DefaultAtomVisitor* defaultAtomVisitor;
36 <  LipidHeadVisitor* lipidVisitor;
37 <  RBCOMVisitor* rbCOMVisitor;
38 <  ReplicateVisitor* replicateVisitor;
39 <  WrappingVisitor* wrappingVisitor;
40 <  IgnoreVisitor* ignoreVisitor;
41 <  XYZVisitor* xyzVisitor;
42 <  ZConsVisitor* zconsVisitor;
43 <  PrepareVisitor* prepareVisitor;
44 <  WaterTypeVisitor* waterTypeVisitor;
65 >  //register force fields
66 >  registerForceFields();
67    
68 +  gengetopt_args_info args_info;
69 +  std::string dumpFileName;
70 +  std::string mdFileName;
71 +  std::string xyzFileName;
72 +  
73    //parse the command line option
74 <    if (cmdline_parser (argc, argv, &args_info) != 0)
75 <      exit(1) ;
76 <
77 <
74 >  if (cmdline_parser (argc, argv, &args_info) != 0) {
75 >    exit(1) ;
76 >  }
77 >  
78    //get the dumpfile name and meta-data file name
79    if (args_info.input_given){
80      dumpFileName = args_info.input_arg;
81 <  }
82 <  else{
56 <    cerr << "Does not have input file name" << endl;
81 >  } else {
82 >    std::cerr << "Does not have input file name" << std::endl;
83      exit(1);
84    }
85 +  
86    mdFileName = dumpFileName;
87    mdFileName = mdFileName.substr(0, mdFileName.rfind(".")) + ".md";
88  
89    if (args_info.output_given){
90      xyzFileName = args_info.output_arg;
91 <  }
65 <  else{
91 >  } else {
92      xyzFileName = dumpFileName;
93      xyzFileName = xyzFileName.substr(0, xyzFileName.rfind(".")) + ".xyz";
94    }
95 <
95 >  
96    //parse md file and set up the system
97 <  info = new SimInfo();
98 <  startMe.setSimInfo(info );
73 <
74 <  strcpy(inFileName, mdFileName.c_str() );
75 <  startMe.parseFile( inFileName );
76 <
77 <  startMe.createSim();
78 <
97 >  SimCreator creator;
98 >  SimInfo* info = creator.createSim(mdFileName, false);
99    
100 +  
101 +  
102    //creat visitor list
103 <  compositeVisitor = new CompositeVisitor();
82 <
83 <  //creat ignore visitor
84 <  if(args_info.ignore_given ||args_info.water_flag){
103 >  CompositeVisitor* compositeVisitor = new CompositeVisitor();
104      
86    ignoreVisitor = new IgnoreVisitor();
87
88    for(int i = 0; i < args_info.ignore_given; i++)
89      ignoreVisitor->addIgnoreType(args_info.ignore_arg[i]);
90
91    //ignore water
92    if(args_info.water_flag){
93      ignoreVisitor->addIgnoreType("SSD");
94      ignoreVisitor->addIgnoreType("SSD1");
95      ignoreVisitor->addIgnoreType("SSD_E");
96      ignoreVisitor->addIgnoreType("SSD_RF");
97      ignoreVisitor->addIgnoreType("TIP3P_RB_0");
98      ignoreVisitor->addIgnoreType("TIP4P_RB_0");
99      ignoreVisitor->addIgnoreType("TIP5P_RB_0");
100      ignoreVisitor->addIgnoreType("SPCE_RB_0");      
101      ignoreVisitor->addIgnoreType("DPD_RB_0");
102    }
103
104     compositeVisitor->addVisitor(ignoreVisitor, 1000);
105  }
106
105    //creat RigidBody Visitor
106    if(args_info.rigidbody_flag){
107 <    rbCOMVisitor = new RBCOMVisitor(info);
107 >    RBCOMVisitor* rbCOMVisitor = new RBCOMVisitor(info);
108      compositeVisitor->addVisitor(rbCOMVisitor, 900);
109    }
110 <
113 <  //compositeVisitor->addVisitor(lipidVisitor, 900);
114 <
110 >  
111    //creat SSD atom visitor
112 <  ssdVisitor = new SSDAtomVisitor(info);
112 >  SSDAtomVisitor* ssdVisitor = new SSDAtomVisitor(info);
113    compositeVisitor->addVisitor(ssdVisitor, 800);
114 <  linearVisitor = new LinearAtomVisitor(info);
114 >  
115 >  LinearAtomVisitor* linearVisitor = new LinearAtomVisitor(info);
116    compositeVisitor->addVisitor(linearVisitor, 750);
117 <
117 >  
118    //creat default atom visitor
119 <  defaultAtomVisitor = new DefaultAtomVisitor(info);
119 >  DefaultAtomVisitor* defaultAtomVisitor = new DefaultAtomVisitor(info);
120    compositeVisitor->addVisitor(defaultAtomVisitor, 700);
121 <
121 >  
122    //creat waterType visitor
123    if(args_info.watertype_flag){
124 <    waterTypeVisitor = new WaterTypeVisitor;
124 >    WaterTypeVisitor* waterTypeVisitor = new WaterTypeVisitor;
125      compositeVisitor->addVisitor(waterTypeVisitor, 600);
126    }
127 <
127 >  
128    //create ZconsVisitor
129    if(args_info.zconstraint_flag){
133    
134    zconsVisitor = new ZConsVisitor(info);
130  
131 <    if(zconsVisitor->haveZconsMol())
131 >    ZConsVisitor* zconsVisitor = new ZConsVisitor(info);
132 >    
133 >    if(zconsVisitor->haveZconsMol()) {
134        compositeVisitor->addVisitor(zconsVisitor, 500);
135 <    else
135 >    } else {
136        delete zconsVisitor;
137 +    }
138    }
139 <
139 >  
140    //creat wrapping visitor
141 <
141 >  
142    if(args_info.periodicBox_flag){
143 <    wrappingVisitor = new WrappingVisitor(info);
143 >    WrappingVisitor* wrappingVisitor = new WrappingVisitor(info);
144      compositeVisitor->addVisitor(wrappingVisitor, 400);
145    }
146 <  
146 >
147    //creat replicate visitor
148    if(args_info.repeatX_given > 0 || args_info.repeatY_given > 0 ||args_info.repeatY_given > 0){
149 <    IntVec3 replicateOpt(args_info.repeatX_arg, args_info.repeatY_arg, args_info.repeatZ_arg);
150 <    replicateVisitor = new ReplicateVisitor(info, replicateOpt);
149 >    Vector3i replicateOpt(args_info.repeatX_arg, args_info.repeatY_arg, args_info.repeatZ_arg);
150 >    ReplicateVisitor* replicateVisitor = new ReplicateVisitor(info, replicateOpt);
151      compositeVisitor->addVisitor(replicateVisitor, 300);
152    }
153  
154 +
155 +  //create rotation visitor
156 +  if (args_info.refsele_given&& args_info.originsele_given) {
157 +    compositeVisitor->addVisitor(new LipidTransVisitor(info, args_info.originsele_arg, args_info.refsele_arg), 250);
158 +  } else if (args_info.refsele_given || args_info.originsele_given) {
159 +    std::cerr << "Both of --refsele and --originsele should appear by pair" << std::endl;
160 +    exit(1);
161 +  }
162 +    
163    //creat xyzVisitor
164 <  xyzVisitor = new XYZVisitor(info);
164 >  XYZVisitor* xyzVisitor;
165 >  if (args_info.selection_given) {
166 >    xyzVisitor = new XYZVisitor(info, args_info.selection_arg);
167 >  } else {
168 >    xyzVisitor = new XYZVisitor(info);
169 >  }
170    compositeVisitor->addVisitor(xyzVisitor, 200);
171 <
172 <  cout << compositeVisitor->toString();
173 <
171 >  
172 >  std::cout << compositeVisitor->toString();
173 >  
174    //creat prepareVisitor
175 <  prepareVisitor = new PrepareVisitor();
176 <
175 >  PrepareVisitor* prepareVisitor = new PrepareVisitor();
176 >  
177    //open dump file
178 <  dumpReader = new DumpReader(dumpFileName.c_str());
179 <  nframes = dumpReader->getNframes();
180 <
178 >  DumpReader* dumpReader = new DumpReader(info, dumpFileName);
179 >  int nframes = dumpReader->getNFrames();
180 >  
181 >  
182 >  std::ofstream xyzStream;    
183    xyzStream .open(xyzFileName.c_str());
184    
185 +  
186 +  SimInfo::MoleculeIterator miter;
187 +  Molecule::IntegrableObjectIterator  iiter;
188 +  Molecule::RigidBodyIterator rbIter;
189 +  Molecule* mol;
190 +  StuntDouble* integrableObject;
191 +  RigidBody* rb;
192 +      
193    for (int i = 0; i < nframes; i += args_info.frame_arg){
194 <    dumpReader->readFrame(info, i);
195 <
174 <    mol = info->molecules;
175 <
194 >    dumpReader->readFrame(i);
195 >    
196      //update atoms of rigidbody
197 <    for(int j = 0; j < info->n_mol; j++){
198 <      myRigidBodies = mol[j].getMyRigidBodies();
199 <
200 <      for(rbIter = myRigidBodies.begin(); rbIter != myRigidBodies.end(); ++rbIter)
201 <        (*rbIter)->updateAtoms();
202 <    }    
203 <
197 >    for (mol = info->beginMolecule(miter); mol != NULL; mol = info->nextMolecule(miter)) {
198 >      
199 >      //change the positions of atoms which belong to the rigidbodies
200 >      for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) {
201 >        rb->updateAtoms();
202 >      }
203 >    }
204      
205      //prepare visit
206 <    for(int j = 0; j < info->n_mol; j++){
207 <      integrableObjects = mol[j].getIntegrableObjects();
208 <
209 <      for(iter = integrableObjects.begin(); iter != integrableObjects.end(); ++iter)
210 <        (*iter)->accept(prepareVisitor);
211 <    }    
212 <
206 >    for (mol = info->beginMolecule(miter); mol != NULL; mol = info->nextMolecule(miter)) {
207 >      for (integrableObject = mol->beginIntegrableObject(iiter); integrableObject != NULL;
208 >           integrableObject = mol->nextIntegrableObject(iiter)) {
209 >        integrableObject->accept(prepareVisitor);
210 >      }
211 >    }
212 >    
213      //update visitor
214      compositeVisitor->update();
195    
196    //visit stuntdouble
197    for(int j = 0; j < info->n_mol; j++){
198      integrableObjects = mol[j].getIntegrableObjects();
215  
200      for(iter = integrableObjects.begin(); iter != integrableObjects.end(); ++iter)
201        (*iter)->accept(compositeVisitor);
202    }
216  
217 +    //visit stuntdouble
218 +    for (mol = info->beginMolecule(miter); mol != NULL; mol = info->nextMolecule(miter)) {
219 +      for (integrableObject = mol->beginIntegrableObject(iiter); integrableObject != NULL;
220 +           integrableObject = mol->nextIntegrableObject(iiter)) {
221 +        integrableObject->accept(compositeVisitor);
222 +      }
223 +    }
224 +    
225      xyzVisitor->writeFrame(xyzStream);
226      xyzVisitor->clear();
227      
228    }//end for (int i = 0; i < nframes; i += args_info.frame_arg)
229 <
229 >  
230    xyzStream.close();
231 <
232 <
231 >  
232 >  
233    delete compositeVisitor;
234    delete info;
235 <
215 <
235 >  
236   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines