Changes in / [0d5dce:8f822c]
- Files:
-
- 20 added
- 100 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/ActionRegistry.cpp
r0d5dce r8f822c 19 19 using namespace std; 20 20 21 /** Constructor for class ActionRegistry. 22 */ 21 23 ActionRegistry::ActionRegistry() 22 24 { 23 25 } 24 26 27 /** Destructor for class ActionRegistry. 28 */ 25 29 ActionRegistry::~ActionRegistry() 26 30 { … … 32 36 } 33 37 38 /** Returns pointer to an action named by \a name. 39 * \param name name of action 40 * \return pointer to Action 41 */ 34 42 Action* ActionRegistry::getActionByName(const std::string name){ 35 43 map<const string,Action*>::iterator iter; … … 39 47 } 40 48 49 /** States whether action is present or not. 50 * \note This iss needed as ActionRegistry::getActionByName() ASSERT()s that action is in map. 51 * \param name name of action 52 * \return true - Action present, false - Action absent 53 */ 41 54 bool ActionRegistry::isActionByNamePresent(const std::string name){ 42 55 map<const string,Action*>::iterator iter; … … 45 58 } 46 59 60 /** Registers an Action with the ActionRegistry. 61 * \param *action pointer to Action. 62 */ 47 63 void ActionRegistry::registerAction(Action* action){ 48 64 pair<map<const string,Action*>::iterator,bool> ret; 65 //cout << "Trying to register action with name " << action->getName() << "." << endl; 49 66 ret = actionMap.insert(pair<const string,Action*>(action->getName(),action)); 50 67 ASSERT(ret.second,"Two actions with the same name added to registry"); 51 68 } 52 69 70 /** Unregisters an Action. 71 * \param *action pointer to Action. 72 */ 53 73 void ActionRegistry::unregisterAction(Action* action){ 74 //cout << "Unregistering action with name " << action->getName() << "." << endl; 54 75 actionMap.erase(action->getName()); 55 76 } 56 77 78 /** Returns an iterator pointing to the start of the map of Action's. 79 * \return begin iterator 80 */ 57 81 std::map<const std::string,Action*>::iterator ActionRegistry::getBeginIter() 58 82 { … … 60 84 } 61 85 86 /** Returns an iterator pointing to the end of the map of Action's. 87 * \return end iterator 88 */ 62 89 std::map<const std::string,Action*>::iterator ActionRegistry::getEndIter() 63 90 { … … 65 92 } 66 93 94 /** Returns a const iterator pointing to the start of the map of Action's. 95 * \return constant begin iterator 96 */ 97 std::map<const std::string,Action*>::const_iterator ActionRegistry::getBeginIter() const 98 { 99 return actionMap.begin(); 100 } 101 102 /** Returns a const iterator pointing to the end of the map of Action's. 103 * \return constant end iterator 104 */ 105 std::map<const std::string,Action*>::const_iterator ActionRegistry::getEndIter() const 106 { 107 return actionMap.end(); 108 } 109 110 /** Prints the contents of the ActionRegistry \a &m to \a &ost. 111 * \param &ost output stream 112 * \param &m reference to ActionRegistry 113 * \return reference to the above out stream for concatenation 114 */ 115 ostream& operator<<(ostream& ost, const ActionRegistry& m) 116 { 117 ost << "ActionRegistry contains:" << endl; 118 for (std::map<const std::string,Action*>::const_iterator iter = m.getBeginIter(); iter != m.getEndIter(); ++iter) { 119 ost << "\t" << iter->first << " with pointer " << iter->second << endl; 120 } 121 return ost; 122 }; 123 124 125 67 126 CONSTRUCT_SINGLETON(ActionRegistry) -
src/Actions/ActionRegistry.hpp
r0d5dce r8f822c 9 9 #define ACTIONREGISTRY_HPP_ 10 10 11 #include <iostream> 11 12 #include <string> 12 13 #include <map> … … 26 27 27 28 std::map<const std::string,Action*>::iterator getBeginIter(); 29 std::map<const std::string,Action*>::const_iterator getBeginIter() const; 28 30 std::map<const std::string,Action*>::iterator getEndIter(); 31 std::map<const std::string,Action*>::const_iterator getEndIter() const; 29 32 30 33 private: … … 36 39 }; 37 40 41 std::ostream& operator<<(std::ostream& ost, const ActionRegistry& m); 42 38 43 #endif /* ACTIONREGISTRY_HPP_ */ -
src/Actions/AnalysisAction/PairCorrelationAction.cpp
r0d5dce r8f822c 67 67 dialog = UIFactory::getInstance().makeDialog(); 68 68 if (type == "P") 69 dialog->queryVector("position", &Point, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription("position"));69 dialog->queryVector("position", &Point, false, MapOfActions::getInstance().getDescription("position")); 70 70 if (type == "S") 71 71 dialog->queryMolecule("molecule-by-id", &Boundary, MapOfActions::getInstance().getDescription("molecule-by-id")); -
src/Actions/AtomAction/AddAction.cpp
r0d5dce r8f822c 41 41 42 42 dialog->queryElement(NAME, &elements, MapOfActions::getInstance().getDescription(NAME)); 43 dialog->queryVector("position", &position, World::getInstance().getDomain(),true, MapOfActions::getInstance().getDescription("position"));43 dialog->queryVector("position", &position, true, MapOfActions::getInstance().getDescription("position")); 44 44 cout << "pre-dialog" << endl; 45 45 -
src/Actions/CmdAction/BondLengthTableAction.cpp
r0d5dce r8f822c 9 9 10 10 #include "Actions/CmdAction/BondLengthTableAction.hpp" 11 #include "bondgraph.hpp" 11 12 #include "config.hpp" 12 13 #include "log.hpp" -
src/Actions/FragmentationAction/DepthFirstSearchAction.cpp
r0d5dce r8f822c 10 10 #include "Actions/FragmentationAction/DepthFirstSearchAction.hpp" 11 11 #include "atom.hpp" 12 #include "bondgraph.hpp" 12 13 #include "config.hpp" 13 14 #include "log.hpp" -
src/Actions/FragmentationAction/FragmentationAction.cpp
r0d5dce r8f822c 10 10 #include "Actions/FragmentationAction/FragmentationAction.hpp" 11 11 #include "atom.hpp" 12 #include "bondgraph.hpp" 12 13 #include "config.hpp" 13 14 #include "log.hpp" … … 41 42 double distance = -1.; 42 43 int order = 0; 44 std::string path; 43 45 config *configuration = World::getInstance().getConfig(); 44 46 int ExitFlag = 0; 45 47 46 48 cout << "pre-dialog"<< endl; 47 dialog->queryMolecule(NAME, &mol, MapOfActions::getInstance().getDescription(NAME)); 49 dialog->queryString(NAME, &path, MapOfActions::getInstance().getDescription(NAME)); 50 dialog->queryMolecule("molecule-by-id", &mol, MapOfActions::getInstance().getDescription("molecule-by-id")); 48 51 dialog->queryDouble("distance", &distance, MapOfActions::getInstance().getDescription("distance")); 49 52 dialog->queryInt("order", &order, MapOfActions::getInstance().getDescription("order")); … … 58 61 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl); 59 62 if (mol->hasBondStructure()) { 60 ExitFlag = mol->FragmentMolecule(order, configuration);63 ExitFlag = mol->FragmentMolecule(order, path); 61 64 } 62 65 World::getInstance().setExitFlag(ExitFlag); -
src/Actions/Makefile.am
r0d5dce r8f822c 120 120 WorldAction/CenterOnEdgeAction.cpp \ 121 121 WorldAction/ChangeBoxAction.cpp \ 122 WorldAction/InputAction.cpp \ 123 WorldAction/OutputAction.cpp \ 122 124 WorldAction/RemoveSphereOfAtomsAction.cpp \ 123 125 WorldAction/RepeatBoxAction.cpp \ … … 131 133 WorldAction/CenterOnEdgeAction.hpp \ 132 134 WorldAction/ChangeBoxAction.hpp \ 135 WorldAction/InputAction.hpp \ 136 WorldAction/OutputAction.hpp \ 133 137 WorldAction/RemoveSphereOfAtomsAction.hpp \ 134 138 WorldAction/RepeatBoxAction.hpp \ -
src/Actions/MapOfActions.cpp
r0d5dce r8f822c 22 22 #include "verbose.hpp" 23 23 24 #include "Actions/ActionRegistry.hpp" 25 #include "Actions/AnalysisAction/MolecularVolumeAction.hpp" 26 #include "Actions/AnalysisAction/PairCorrelationAction.hpp" 27 #include "Actions/AnalysisAction/PrincipalAxisSystemAction.hpp" 28 #include "Actions/AtomAction/AddAction.hpp" 29 #include "Actions/AtomAction/ChangeElementAction.hpp" 30 #include "Actions/AtomAction/RemoveAction.hpp" 31 #include "Actions/CmdAction/BondLengthTableAction.hpp" 32 #include "Actions/CmdAction/ElementDbAction.hpp" 33 #include "Actions/CmdAction/FastParsingAction.hpp" 34 #include "Actions/CmdAction/HelpAction.hpp" 35 #include "Actions/CmdAction/VerboseAction.hpp" 36 #include "Actions/CmdAction/VersionAction.hpp" 37 #include "Actions/FragmentationAction/DepthFirstSearchAction.hpp" 38 #include "Actions/FragmentationAction/SubgraphDissectionAction.hpp" 39 #include "Actions/FragmentationAction/FragmentationAction.hpp" 40 #include "Actions/MoleculeAction/BondFileAction.hpp" 41 #include "Actions/MoleculeAction/ChangeNameAction.hpp" 42 #include "Actions/MoleculeAction/FillWithMoleculeAction.hpp" 43 #include "Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.hpp" 44 #include "Actions/MoleculeAction/SaveAdjacencyAction.hpp" 45 #include "Actions/MoleculeAction/SaveBondsAction.hpp" 46 #include "Actions/MoleculeAction/SaveTemperatureAction.hpp" 47 #include "Actions/MoleculeAction/TranslateAction.hpp" 48 #include "Actions/MoleculeAction/VerletIntegrationAction.hpp" 49 #include "Actions/ParserAction/LoadXyzAction.hpp" 50 #include "Actions/ParserAction/SaveXyzAction.hpp" 51 #include "Actions/TesselationAction/ConvexEnvelopeAction.hpp" 52 #include "Actions/TesselationAction/NonConvexEnvelopeAction.hpp" 53 #include "Actions/WorldAction/AddEmptyBoundaryAction.hpp" 54 #include "Actions/WorldAction/BoundInBoxAction.hpp" 55 #include "Actions/WorldAction/CenterInBoxAction.hpp" 56 #include "Actions/WorldAction/CenterOnEdgeAction.hpp" 57 #include "Actions/WorldAction/ChangeBoxAction.hpp" 58 #include "Actions/WorldAction/InputAction.hpp" 59 #include "Actions/WorldAction/OutputAction.hpp" 60 #include "Actions/WorldAction/RemoveSphereOfAtomsAction.hpp" 61 #include "Actions/WorldAction/RepeatBoxAction.hpp" 62 #include "Actions/WorldAction/ScaleBoxAction.hpp" 63 #include "Actions/WorldAction/SetDefaultNameAction.hpp" 64 #include "Actions/WorldAction/SetGaussianBasisAction.hpp" 24 65 #include "Actions/Values.hpp" 25 66 … … 83 124 DescriptionMap["fragment-mol"] = "create for a given molecule into fragments up to given order"; 84 125 DescriptionMap["help"] = "Give this help screen"; 126 DescriptionMap["input"] = "specify input files"; 85 127 DescriptionMap["linear-interpolate"] = "linear interpolation in discrete steps between start and end position of a molecule"; 86 128 DescriptionMap["nonconvex-envelope"] = "create the non-convex envelope for a molecule"; 87 129 DescriptionMap["molecular-volume"] = "calculate the volume of a given molecule"; 130 DescriptionMap["output"] = "specify output formats"; 88 131 DescriptionMap["pair-correlation"] = "pair correlation analysis between two elements, element and point or element and surface"; 89 132 DescriptionMap["parse-xyz"] = "parse xyz file into World"; … … 97 140 DescriptionMap["save-bonds"] = "name of the bonds file to write to"; 98 141 DescriptionMap["save-temperature"] = "name of the temperature file to write to"; 142 DescriptionMap["SaveXyz"] = "save world as xyz file"; 99 143 DescriptionMap["scale-box"] = "scale box and atomic positions inside"; 100 144 DescriptionMap["subgraph-dissect"] = "dissect the molecular system into molecules representing disconnected subgraphs"; … … 185 229 TypeMap["fastparsing"] = Boolean; 186 230 TypeMap["fill-molecule"] = String; 187 TypeMap["fragment-mol"] = Molecule;231 TypeMap["fragment-mol"] = String; 188 232 TypeMap["input"] = String; 189 233 TypeMap["linear-interpolate"] = String; 190 234 TypeMap["molecular-volume"] = Molecule; 191 235 TypeMap["nonconvex-envelope"] = Molecule; 236 TypeMap["output"] = String; 192 237 TypeMap["parse-xyz"] = String; 193 238 TypeMap["pair-correlation"] = String; … … 242 287 DefaultValue["periodic"] = "0"; 243 288 244 245 // list of generic actions 289 // put action into each menu category 290 MenuContainsActionMap.insert( pair<std::string, std::string> ("analysis", "molecular-volume") ); 291 MenuContainsActionMap.insert( pair<std::string, std::string> ("analysis", "pair-correlation") ); 292 MenuContainsActionMap.insert( pair<std::string, std::string> ("analysis", "principal-axis-system") ); 293 294 MenuContainsActionMap.insert( pair<std::string, std::string> ("atom", "add-atom") ); 295 MenuContainsActionMap.insert( pair<std::string, std::string> ("atom", "change-element") ); 296 MenuContainsActionMap.insert( pair<std::string, std::string> ("atom", "remove-atom") ); 297 298 MenuContainsActionMap.insert( pair<std::string, std::string> ("command", "bond-table") ); 299 MenuContainsActionMap.insert( pair<std::string, std::string> ("command", "element-db") ); 300 MenuContainsActionMap.insert( pair<std::string, std::string> ("command", "fastparsing") ); 301 MenuContainsActionMap.insert( pair<std::string, std::string> ("command", "verbose") ); 302 MenuContainsActionMap.insert( pair<std::string, std::string> ("command", "version") ); 303 304 MenuContainsActionMap.insert( pair<std::string, std::string> ("fragmentation", "depth-first-search") ); 305 MenuContainsActionMap.insert( pair<std::string, std::string> ("fragmentation", "fragment-mol") ); 306 MenuContainsActionMap.insert( pair<std::string, std::string> ("fragmentation", "subgraph-dissect") ); 307 308 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "bond-file") ); 309 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "change-molname") ); 310 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "fill-molecule") ); 311 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "linear-interpolate") ); 312 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "rotate-to-pas") ); 313 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "save-adjacency") ); 314 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "save-bonds") ); 315 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "save-temperature") ); 316 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "suspend-in-water") ); 317 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "translate-mol") ); 318 MenuContainsActionMap.insert( pair<std::string, std::string> ("molecule", "verlet-integrate") ); 319 320 MenuContainsActionMap.insert( pair<std::string, std::string> ("parser", "parse-xyz") ); 321 MenuContainsActionMap.insert( pair<std::string, std::string> ("parser", "SaveXyz") ); 322 323 MenuContainsActionMap.insert( pair<std::string, std::string> ("tesselation", "convex-envelope") ); 324 MenuContainsActionMap.insert( pair<std::string, std::string> ("tesselation", "nonconvex-envelope") ); 325 326 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "boundary") ); 327 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "bound-in-box") ); 328 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "center-in-box") ); 329 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "center-edge") ); 330 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "change-box") ); 331 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "input") ); 332 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "output") ); 333 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "remove-sphere") ); 334 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "repeat-box") ); 335 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "scale-box") ); 336 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "default-molname") ); 337 MenuContainsActionMap.insert( pair<std::string, std::string> ("world", "set-basis") ); 338 339 // put actions into command line category 246 340 generic.insert("add-atom"); 247 341 generic.insert("bond-file"); … … 262 356 generic.insert("fragment-mol"); 263 357 generic.insert("help"); 264 generic.insert("linear-interpolate"); 358 generic.insert("input"); 359 generic.insert("linear-interpolate"); 265 360 // generic.insert("molecular-volume"); 266 361 generic.insert("nonconvex-envelope"); 362 generic.insert("output"); 267 363 generic.insert("pair-correlation"); 268 //generic.insert("parse-xyz");364 generic.insert("parse-xyz"); 269 365 // generic.insert("principal-axis-system"); 270 366 generic.insert("remove-atom"); … … 323 419 } 324 420 421 422 void MapOfActions::populateActions() 423 { 424 new AnalysisMolecularVolumeAction(); 425 new AnalysisPairCorrelationAction(); 426 new AnalysisPrincipalAxisSystemAction(); 427 428 new AtomAddAction(); 429 new AtomChangeElementAction(); 430 new AtomRemoveAction(); 431 432 new CommandLineBondLengthTableAction(); 433 new CommandLineElementDbAction(); 434 new CommandLineFastParsingAction(); 435 new CommandLineHelpAction(); 436 new CommandLineVerboseAction(); 437 new CommandLineVersionAction(); 438 439 new FragmentationDepthFirstSearchAction(); 440 new FragmentationFragmentationAction(); 441 new FragmentationSubgraphDissectionAction(); 442 443 new MoleculeBondFileAction(); 444 new MoleculeChangeNameAction(); 445 new MoleculeFillWithMoleculeAction(); 446 new MoleculeLinearInterpolationofTrajectoriesAction(); 447 new MoleculeSaveAdjacencyAction(); 448 new MoleculeSaveBondsAction(); 449 new MoleculeSaveTemperatureAction(); 450 new MoleculeTranslateAction(); 451 new MoleculeVerletIntegrationAction(); 452 453 new ParserLoadXyzAction(); 454 new ParserSaveXyzAction(); 455 456 new TesselationConvexEnvelopeAction(); 457 new TesselationNonConvexEnvelopeAction(); 458 459 new WorldAddEmptyBoundaryAction(); 460 new WorldBoundInBoxAction(); 461 new WorldCenterInBoxAction(); 462 new WorldCenterOnEdgeAction(); 463 new WorldChangeBoxAction(); 464 new WorldInputAction(); 465 new WorldOutputAction(); 466 new WorldRemoveSphereOfAtomsAction(); 467 new WorldRepeatBoxAction(); 468 new WorldScaleBoxAction(); 469 new WorldSetDefaultNameAction(); 470 new WorldSetGaussianBasisAction(); 471 } 472 473 325 474 /** Adds all options to the CommandLineParser. 326 475 * -
src/Actions/MapOfActions.hpp
r0d5dce r8f822c 11 11 #include "Helpers/Assert.hpp" 12 12 #include <boost/program_options.hpp> 13 13 14 #include <map> 14 15 #include <set> … … 20 21 namespace po = boost::program_options; 21 22 23 /** Central class for adding functionality to the code. 24 * 25 * In Molecuilder everything that can be done - such as adding atoms, 26 * translating molecules, saving bind information - is an Action. 27 * 28 * In order to reference Action's with what the user sees, this class is the 29 * mediator. 30 * 31 * An Action is described to the user by: 32 * -# a name (this is the most important information) 33 * -# a description 34 * -# a shortform (single letter for use on the command line) 35 * -# a text menu it resides in 36 * -# the type of its argument 37 * -# the command line category 38 * 39 * The Action::NAME is the most important information because every Action 40 * registers itself automatically with the ActionRegistry and can be retrieved 41 * therefrom and from this MapOfActions simply by knowing its name alone. 42 * 43 * In the constructor of MapOfActions all this is set. 44 * 45 * Note that Action will require input from the user. This is done via class 46 * Query. 47 * 48 * And note also that MapOfActions actually contains more than just all 49 * Actions: There are a number of names that actually are just arguments to 50 * actions (e.g. "output-file"). 51 * 52 * <h1> Howto add an Action</h1> 53 * 54 * Let us assume your new action (class) is called SuperDuperAction, consisting 55 * of two files SuperDuperAction.cpp and SuperDuperAction.hpp. 56 * 57 * Furthermore, let's say you Action needs two values: a double value as a 58 * upper threshold and a string which is the name of the output file. 59 * 60 * <h2> Command Line preliminaries </h2> 61 * 62 * You have to decide whether (for the command line) it makes sense to have an 63 * extra argument requesting the arguments, or one should be the argument of 64 * your action. I.e. your action name is "super-duper", then the use may 65 * call your action like this: 66 * 67 * ./molecuilder --super-duper 4 --output-file test.dat 68 * 69 * Here, we have picked the threshold as the value for your action and the 70 * name of the output file is given by an additional argument. Of course, 71 * it can be the other way round or by two arguments such as here: 72 * 73 * ./molecuilder --super-duper --threshold 4 --output-file test.dat 74 * 75 * It depends on what possible arguments are already there (don't make up 76 * new ones if present ones actually make sense for your action) and which 77 * argument is more natural or closer to what your action does. 78 * 79 * <h2> Menu preliminaries </h2> 80 * 81 * Whatever you decide, your action will need some Query dialogs to request 82 * the necessary information from the user, either via a command line 83 * argument (--output-file) via a text dialog (referenced by "output-file") 84 * or via a graphical dialog (same reference). And therein, the names 85 * of the arguments have to re-appear. 86 * 87 * Then, the following steps have to be done to incorporate your Action: 88 * -# create a unique name for your action (no capital letters) to reference 89 * it, this name has to appear in the file SuperDuperAction.cpp, e.g. 90 * "super-duper" 91 * -# pick names the other required arguments, best if they are already 92 * present in the MapOfActions. They have to appear in Query's in the 93 * code of your Action. 94 * -# With this name create entries in the following maps for the action 95 * name and for each names of a desired addtional argument if not present: 96 * -# DescriptionMap, a catchy description of what your action does 97 * -# TypeMap, see MapOfActions::OptionTypes for possible types of the single 98 * argument it takes. 99 * -# MenuContainsActionMap, in which menu should your action appear 100 * -# ShortFormMap (optional), single letter for command line call 101 * -# DefaultValueMap (optional), the default value (always a string) 102 * -# add to one of the command line sets by the following categories 103 * -# generic - generic options (i.e. not one of the others) 104 * -# config - action/argument only considers internal bevahior, user 105 * does not have to see it while still having full functionality 106 * -# hidden - this should be hidden from the user 107 * -# visible - this should be visible to the user 108 * -# inputfile - this should only be parsed from an input file, not 109 * from command line 110 * -# add to a menu, i.e. make an entry in MenuContainsActionMap. 111 * -# add header file SuperDuperAction.hpp to MapOfActions.cpp and instantiate 112 * your action in populateMenu() (mind the sorting: 1. menu, 113 * 2. alphabetical) 114 * 115 * And that's. 116 * 117 * Now, your action can be called from the command line, within the text 118 * menu and the graphical user interface. 119 * 120 */ 22 121 class MapOfActions : public Singleton<MapOfActions> { 23 122 friend class Singleton<MapOfActions>; … … 27 126 28 127 // getter for the action descriptions and short forms 29 std::string getDescription(st ring actionname);30 std::string getKeyAndShortForm(st ring actionname);31 std::string getShortForm(st ring actionname);32 map <std::string, std::string> getShortFormToActionMap();128 std::string getDescription(std::string actionname); 129 std::string getKeyAndShortForm(std::string actionname); 130 std::string getShortForm(std::string actionname); 131 std::map <std::string, std::string> getShortFormToActionMap(); 33 132 34 133 void AddOptionsToParser(); 35 134 36 135 // check presence and getter for action type 37 bool hasValue(st ring actionname);38 bool isShortFormPresent(st ring shortform);39 enum OptionTypes getValueType(st ring actionname);136 bool hasValue(std::string actionname); 137 bool isShortFormPresent(std::string shortform); 138 enum OptionTypes getValueType(std::string actionname); 40 139 41 set<string> generic; 42 set<string> config; 43 set<string> hidden; 44 set<string> visible; 45 set<string> inputfile; 140 std::set<std::string> generic; 141 std::set<std::string> config; 142 std::set<std::string> hidden; 143 std::set<std::string> visible; 144 std::set<std::string> inputfile; 145 146 std::multimap <std::string, std::string> MenuContainsActionMap; 147 148 // instantiates and puts all known actions into the ActionRegistry 149 void populateActions(); 46 150 47 151 private: … … 51 155 52 156 // lookup list from our configs to the ones of CommandLineParser 53 map<set<std::string> *, po::options_description *> CmdParserLookup;157 std::map< std::set<std::string> *, po::options_description *> CmdParserLookup; 54 158 55 159 // map of the action names and their description 56 map<std::string, std::string> DefaultValue;57 map<std::string, std::string> DescriptionMap;58 map<std::string, std::string> ShortFormMap;59 map<std::string, enum OptionTypes > TypeMap;160 std::map<std::string, std::string> DefaultValue; 161 std::map<std::string, std::string> DescriptionMap; 162 std::map<std::string, std::string> ShortFormMap; 163 std::map<std::string, enum OptionTypes > TypeMap; 60 164 }; 61 165 -
src/Actions/MoleculeAction/ChangeNameAction.cpp
r0d5dce r8f822c 36 36 }; 37 37 38 const char MoleculeChangeNameAction::NAME[] = " Change filename of Molecule";38 const char MoleculeChangeNameAction::NAME[] = "change-molname"; 39 39 40 40 MoleculeChangeNameAction::MoleculeChangeNameAction() : -
src/Actions/MoleculeAction/FillWithMoleculeAction.cpp
r0d5dce r8f822c 62 62 63 63 dialog->queryString(NAME, &filename, MapOfActions::getInstance().getDescription(NAME)); 64 dialog->queryVector("distances", &distances, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription("distances"));65 dialog->queryVector("lengths", &lengths, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription("lengths"));64 dialog->queryVector("distances", &distances, false, MapOfActions::getInstance().getDescription("distances")); 65 dialog->queryVector("lengths", &lengths, false, MapOfActions::getInstance().getDescription("lengths")); 66 66 dialog->queryBoolean("DoRotate", &DoRotate, MapOfActions::getInstance().getDescription("DoRotate")); 67 67 dialog->queryDouble("MaxDistance", &MaxDistance, MapOfActions::getInstance().getDescription("MaxDistance")); … … 102 102 World::getInstance().getMolecules()->insert(Filling); 103 103 } 104 for (molecule::iterator iter = filler->begin(); !filler->empty(); iter = filler->begin()) { 105 atom *Walker = *iter; 106 filler->erase(iter); 107 World::getInstance().destroyAtom(Walker); 108 } 104 109 World::getInstance().destroyMolecule(filler); 105 110 -
src/Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.cpp
r0d5dce r8f822c 69 69 if (IdMapping) 70 70 DoLog(1) && (Log() << Verbose(1) << "Using Identity for the permutation map." << endl); 71 char outputname[MAXSTRINGSIZE]; 72 strcpy(outputname, filename.c_str()); 73 // TODO: LinearInterpolationBetweenConfiguration should use stream, not the filename directly! (better for unit test) 74 if (!mol->LinearInterpolationBetweenConfiguration(start, end, outputname, *(World::getInstance().getConfig()), IdMapping)) 75 DoLog(2) && (Log() << Verbose(2) << "Could not store " << outputname << " files." << endl); 71 if (!mol->LinearInterpolationBetweenConfiguration(start, end, filename, *(World::getInstance().getConfig()), IdMapping)) 72 DoLog(2) && (Log() << Verbose(2) << "Could not store " << filename << " files." << endl); 76 73 else 77 74 DoLog(2) && (Log() << Verbose(2) << "Steps created and " << filename << " files stored." << endl); -
src/Actions/MoleculeAction/SaveAdjacencyAction.cpp
r0d5dce r8f822c 65 65 World::getInstance().getConfig()->BG->ConstructBondGraph(mol); 66 66 // TODO: sollte stream nicht filename benutzen, besser fuer unit test 67 char outputname[MAXSTRINGSIZE]; 68 strcpy(outputname, filename.c_str()); 69 mol->StoreAdjacencyToFile(NULL, outputname); 67 mol->StoreAdjacencyToFile(filename); 70 68 delete dialog; 71 69 return Action::success; -
src/Actions/MoleculeAction/SaveBondsAction.cpp
r0d5dce r8f822c 64 64 DoLog(0) && (Log() << Verbose(0) << "Storing bonds to path " << filename << "." << endl); 65 65 World::getInstance().getConfig()->BG->ConstructBondGraph(mol); 66 // TODO: sollte stream, nicht filenamen direkt nutzen, beser fuer unit tests 67 char outputname[MAXSTRINGSIZE]; 68 strcpy(outputname, filename.c_str()); 69 mol->StoreBondsToFile(NULL, outputname); 66 // TODO: sollte stream, nicht filenamen direkt nutzen, besser fuer unit tests 67 mol->StoreBondsToFile(filename); 70 68 delete dialog; 71 69 return Action::success; -
src/Actions/MoleculeAction/TranslateAction.cpp
r0d5dce r8f822c 55 55 bool periodic = false; 56 56 57 dialog->queryVector(NAME, &x, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));57 dialog->queryVector(NAME, &x, false, MapOfActions::getInstance().getDescription(NAME)); 58 58 dialog->queryMolecule("molecule-by-id", &mol, MapOfActions::getInstance().getDescription("molecule-by-id")); 59 59 dialog->queryBoolean("periodic", &periodic, MapOfActions::getInstance().getDescription("periodic")); -
src/Actions/ParserAction/LoadXyzAction.cpp
r0d5dce r8f822c 8 8 #include "Helpers/MemDebug.hpp" 9 9 10 using namespace std; 11 10 12 #include "Actions/ParserAction/LoadXyzAction.hpp" 11 13 #include "Parser/XyzParser.hpp" 12 14 13 15 #include <iostream> 16 #include <set> 14 17 #include <string> 18 #include <vector> 15 19 16 using namespace std;17 20 18 21 #include "UIElements/UIFactory.hpp" … … 21 24 22 25 #include "atom.hpp" 26 #include "log.hpp" 23 27 #include "molecule.hpp" 28 #include "verbose.hpp" 29 #include "World.hpp" 24 30 25 31 /****** ParserLoadXyzAction *****/ … … 37 43 //}; 38 44 39 const char ParserLoadXyzAction::NAME[] = " LoadXyz";45 const char ParserLoadXyzAction::NAME[] = "parse-xyz"; 40 46 41 47 ParserLoadXyzAction::ParserLoadXyzAction() : … … 48 54 Action::state_ptr ParserLoadXyzAction::performCall() { 49 55 string filename; 50 XyzParser parser;51 56 Dialog *dialog = UIFactory::getInstance().makeDialog(); 52 57 53 dialog->queryString( "filename",&filename, "Filename of the xyz file");58 dialog->queryString(NAME,&filename, NAME); 54 59 55 60 if(dialog->display()) { 61 DoLog(1) && (Log() << Verbose(1) << "Parsing xyz file for new atoms." << endl); 56 62 // parse xyz file 57 63 ifstream input; 58 64 input.open(filename.c_str()); 59 if (!input.fail()) 65 if (!input.fail()) { 66 // TODO: Remove the insertion into molecule when saving does not depend on them anymore. Also, remove molecule.hpp include 67 set <atom*> UniqueList; 68 { 69 vector<atom *> ListBefore = World::getInstance().getAllAtoms(); 70 for (vector<atom *>::iterator runner = ListBefore.begin();runner != ListBefore.end(); ++runner) 71 UniqueList.insert(*runner); 72 } 73 XyzParser parser; // briefly instantiate a parser which is removed at end of focus 60 74 parser.load(&input); 75 { 76 vector<atom *> ListAfter = World::getInstance().getAllAtoms(); 77 pair< set<atom *>::iterator, bool > Inserter; 78 if (UniqueList.size() != ListAfter.size()) { // only create if new atoms have been parsed 79 MoleculeListClass *molecules = World::getInstance().getMolecules(); 80 molecule *mol= NULL; 81 if (molecules->ListOfMolecules.empty()) { 82 mol = World::getInstance().createMolecule(); 83 molecules->insert(mol); 84 } else { 85 mol = *(molecules->ListOfMolecules.begin()); 86 } 87 for (vector<atom *>::iterator runner = ListAfter.begin(); runner != ListAfter.end(); ++runner) { 88 Inserter = UniqueList.insert(*runner); 89 if (Inserter.second) { // if not present, then new (just parsed) atom, add ... 90 cout << "Adding new atom " << **runner << " to new mol." << endl; 91 mol->AddAtom(*runner); 92 } 93 } 94 mol->doCountAtoms(); 95 } else { 96 cout << "No atoms parsed?" << endl; 97 } 98 } 99 } else { 100 DoeLog(1) && (eLog() << Verbose(1) << "Could not open file " << filename << "." << endl); 101 } 61 102 input.close(); 62 103 } -
src/Actions/WorldAction/AddEmptyBoundaryAction.cpp
r0d5dce r8f822c 41 41 int j=0; 42 42 43 dialog->queryVector(NAME, &boundary, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));43 dialog->queryVector(NAME, &boundary, false, MapOfActions::getInstance().getDescription(NAME)); 44 44 45 45 if(dialog->display()) { … … 59 59 } 60 60 // set new box size 61 double * const cell_size = World::getInstance().getDomain();61 double * const cell_size = new double[6]; 62 62 for (j=0;j<6;j++) 63 63 cell_size[j] = 0.; … … 67 67 cell_size[j] = (Max[i]-Min[i]+2.*boundary[i]); 68 68 } 69 World::getInstance().setDomain(cell_size); 70 delete[] cell_size; 69 71 // translate all atoms, such that Min is aty (0,0,0) 70 72 AtomRunner = AllAtoms.begin(); -
src/Actions/WorldAction/CenterInBoxAction.cpp
r0d5dce r8f822c 34 34 Dialog *dialog = UIFactory::getInstance().makeDialog(); 35 35 36 double *cell_size = World::getInstance().getDomain();36 Box& cell_size = World::getInstance().getDomain(); 37 37 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 38 38 -
src/Actions/WorldAction/CenterOnEdgeAction.cpp
r0d5dce r8f822c 13 13 #include "vector.hpp" 14 14 #include "World.hpp" 15 #include "Matrix.hpp" 15 16 16 17 #include <iostream> … … 37 38 Vector Min; 38 39 Vector Max; 39 int j=0;40 40 41 41 dialog->queryEmpty(NAME, MapOfActions::getInstance().getDescription(NAME)); … … 57 57 } 58 58 // set new box size 59 double * const cell_size = World::getInstance().getDomain(); 60 for (j=0;j<6;j++) 61 cell_size[j] = 0.; 62 j=-1; 59 Matrix domain; 63 60 for (int i=0;i<NDIM;i++) { 64 j += i+1; 65 cell_size[j] = (Max[i]-Min[i]); 61 double tmp = Max[i]-Min[i]; 62 tmp = fabs(tmp)>=1. ? tmp : 1.0; 63 domain.at(i,i) = tmp; 66 64 } 65 cout << "new domain is: " << domain << endl; 66 World::getInstance().setDomain(domain); 67 67 // translate all atoms, such that Min is aty (0,0,0) 68 68 for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) -
src/Actions/WorldAction/ChangeBoxAction.cpp
r0d5dce r8f822c 12 12 #include "verbose.hpp" 13 13 #include "World.hpp" 14 #include "Box.hpp" 15 #include "Matrix.hpp" 14 16 15 17 #include <iostream> … … 34 36 Dialog *dialog = UIFactory::getInstance().makeDialog(); 35 37 36 double *cell_size = World::getInstance().getDomain();38 Box& cell_size = World::getInstance().getDomain(); 37 39 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 38 40 39 41 if(dialog->display()) { 40 DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size [0] << "," << cell_size[1] << "," << cell_size[2] << "," << cell_size[3] << "," << cell_size[4] << "," << cell_size[5] << ","<< endl);42 DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size.getM() << endl); 41 43 delete dialog; 42 44 return Action::success; -
src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp
r0d5dce r8f822c 41 41 42 42 dialog->queryDouble(NAME, &radius, MapOfActions::getInstance().getDescription(NAME)); 43 dialog->queryVector("position", &point, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription("position"));43 dialog->queryVector("position", &point, false, MapOfActions::getInstance().getDescription("position")); 44 44 45 45 if(dialog->display()) { -
src/Actions/WorldAction/RepeatBoxAction.cpp
r0d5dce r8f822c 13 13 #include "molecule.hpp" 14 14 #include "vector.hpp" 15 #include "Matrix.hpp" 15 16 #include "verbose.hpp" 16 17 #include "World.hpp" 18 #include "Box.hpp" 17 19 18 20 #include <iostream> … … 46 48 MoleculeListClass *molecules = World::getInstance().getMolecules(); 47 49 48 dialog->queryVector(NAME, &Repeater, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));50 dialog->queryVector(NAME, &Repeater, false, MapOfActions::getInstance().getDescription(NAME)); 49 51 //dialog->queryMolecule("molecule-by-id", &mol,MapOfActions::getInstance().getDescription("molecule-by-id")); 50 52 vector<molecule *> AllMolecules; … … 59 61 if(dialog->display()) { 60 62 (cout << "Repeating box " << Repeater << " times for (x,y,z) axis." << endl); 61 double * const cell_size = World::getInstance().getDomain();62 double *M = ReturnFullMatrixforSymmetric(cell_size);63 Matrix M = World::getInstance().getDomain().getM(); 64 Matrix newM = M; 63 65 Vector x,y; 64 66 int n[NDIM]; 67 Matrix repMat; 65 68 for (int axis = 0; axis < NDIM; axis++) { 66 69 Repeater[axis] = floor(Repeater[axis]); … … 69 72 Repeater[axis] = 1; 70 73 } 71 cell_size[(abs(axis+1) == 2) ? 2 : ((abs(axis+2) == 3) ? 5 : 0)] *= Repeater[axis];74 repMat.at(axis,axis) = Repeater[axis]; 72 75 } 76 newM *= repMat; 77 World::getInstance().setDomain(newM); 73 78 74 79 molecule *newmol = NULL; … … 98 103 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 99 104 x = y; 100 x .MatrixMultiplication(M);105 x *= M; 101 106 newmol = World::getInstance().createMolecule(); 102 107 molecules->insert(newmol); … … 118 123 } 119 124 } 120 delete(M);121 125 delete dialog; 122 126 return Action::success; -
src/Actions/WorldAction/ScaleBoxAction.cpp
r0d5dce r8f822c 14 14 #include "verbose.hpp" 15 15 #include "World.hpp" 16 #include "Box.hpp" 17 #include "Matrix.hpp" 16 18 17 19 #include <iostream> … … 37 39 Vector Scaler; 38 40 double x[NDIM]; 39 int j=0;40 41 41 dialog->queryVector(NAME, &Scaler, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));42 dialog->queryVector(NAME, &Scaler, false, MapOfActions::getInstance().getDescription(NAME)); 42 43 43 44 if(dialog->display()) { … … 49 50 (*AtomRunner)->x.ScaleAll(x); 50 51 } 51 j = -1; 52 double * const cell_size = World::getInstance().getDomain(); 52 53 Matrix M = World::getInstance().getDomain().getM(); 54 Matrix scale; 55 53 56 for (int i=0;i<NDIM;i++) { 54 j += i+1; 55 cell_size[j]*=x[i]; 57 scale.at(i,i) = x[i]; 56 58 } 59 M *= scale; 60 World::getInstance().setDomain(M); 57 61 58 62 delete dialog; -
src/CommandLineParser.cpp
r0d5dce r8f822c 56 56 { 57 57 // go through all arguments 58 cout << Verbose(1) << "By default putting input into the sequence." << endl; 59 // TODO: This may be bad, because const string "input" is destroyed at end of function 60 SequenceOfActions.push_back("input"); 58 61 for (int i=1;i<argc;i++) { 59 62 (cout << Verbose(1) << "Checking on " << argv[i] << endl); -
src/Descriptors/AtomDescriptor.cpp
r0d5dce r8f822c 12 12 13 13 #include "World.hpp" 14 15 14 #include "atom.hpp" 16 15 17 16 #include <boost/bind.hpp> 18 #include <cassert> 17 19 18 #include <iostream> 20 19 -
src/Descriptors/MoleculeDescriptor.cpp
r0d5dce r8f822c 16 16 17 17 #include <boost/bind.hpp> 18 #include <cassert>19 18 #include <iostream> 20 19 -
src/Helpers/MemDebug.cpp
r0d5dce r8f822c 6 6 */ 7 7 8 #ifndef NDBEGUG 9 #ifndef NO_MEMDEBUG 8 // NDEBUG implies NO_MEMDEBUG 9 #ifdef NDEBUG 10 # ifndef NO_MEMDEBUG 11 # define NO_MEMDEBUG 12 # endif 13 #endif 14 15 // NO_MEMDEBUG and MEMDEBUG are mutually exclusive, but at least one must be set 16 #ifdef NO_MEMDEBUG 17 # ifdef MEMDEBUG 18 # undef MEMDEBUG 19 # endif 20 #else 21 # ifndef MEMDEBUG 22 # define MEMDEBUG 23 # endif 24 #endif 25 26 #ifdef MEMDEBUG 10 27 11 28 #include <iostream> … … 489 506 } 490 507 #endif 491 #endif -
src/Helpers/MemDebug.hpp
r0d5dce r8f822c 21 21 * your sourcefiles. 22 22 */ 23 #ifndef NDEBUG24 #ifndef NO_MEMDEBUG25 23 26 #ifndef MEMDEBUG 27 #define MEMDEBUG 24 // Set all flags in a way that makes sense 25 26 // NDEBUG implies NO_MEMDEBUG 27 #ifdef NDEBUG 28 # ifndef NO_MEMDEBUG 29 # define NO_MEMDEBUG 30 # endif 28 31 #endif 32 33 // NO_MEMDEBUG and MEMDEBUG are mutually exclusive, but at least one must be set 34 #ifdef NO_MEMDEBUG 35 # ifdef MEMDEBUG 36 # undef MEMDEBUG 37 # endif 38 #else 39 # ifndef MEMDEBUG 40 # define MEMDEBUG 41 # endif 42 #endif 43 44 #ifdef MEMDEBUG 29 45 30 46 #include <new> … … 83 99 #endif 84 100 85 #endif 86 #endif 87 88 89 #ifdef NDEBUG 90 #undef MEMDEBUG 91 #endif 92 93 #ifndef MEMDEBUG 101 #else 94 102 // memory debugging was disabled 95 103 … … 104 112 105 113 #endif 114 115 106 116 #endif /* MEMDEBUG_HPP_ */ -
src/Legacy/oldmenu.cpp
r0d5dce r8f822c 609 609 { 610 610 int Order1; 611 std::string path; 611 612 clock_t start, end; 612 613 … … 614 615 Log() << Verbose(0) << "What's the desired bond order: "; 615 616 cin >> Order1; 617 DoLog(0) && (Log() << Verbose(0) << "What's the output path and prefix [e.g. /home/foo/BondFragment]: "); 618 cin >> path; 616 619 if (mol->hasBondStructure()) { 617 620 start = clock(); 618 mol->FragmentMolecule(Order1, configuration);621 mol->FragmentMolecule(Order1, path); 619 622 end = clock(); 620 623 Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl; -
src/Makefile.am
r0d5dce r8f822c 30 30 atom_trajectoryparticleinfo.hpp 31 31 32 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \ 33 Exceptions/LinearDependenceException.cpp \ 34 Exceptions/MathException.cpp \ 35 Exceptions/NotInvertibleException.cpp \ 36 Exceptions/SkewException.cpp \ 37 Exceptions/ZeroVectorException.cpp 38 39 EXCEPTIONHEADER = Exceptions/CustomException.hpp \ 40 Exceptions/LinearDependenceException.hpp \ 41 Exceptions/MathException.hpp \ 42 Exceptions/NotInvertibleException.hpp \ 43 Exceptions/SkewException.hpp \ 44 Exceptions/ZeroVectorException.hpp 45 46 # TODO: Move Exceptionsource back down, when transition is done 32 47 LINALGSOURCE = \ 48 ${EXCEPTIONSOURCE} \ 33 49 ${HELPERSOURCE} \ 34 50 gslmatrix.cpp \ 35 51 gslvector.cpp \ 36 52 linearsystemofequations.cpp \ 53 Matrix.cpp \ 37 54 Space.cpp \ 38 55 vector.cpp 56 39 57 40 LINALGHEADER = gslmatrix.hpp \ 58 LINALGHEADER = \ 59 ${EXCEPTIONHEADER} \ 60 gslmatrix.hpp \ 41 61 gslvector.hpp \ 42 62 linearsystemofequations.hpp \ 63 Matrix.hpp \ 43 64 Space.hpp \ 44 65 vector.hpp … … 63 84 64 85 ACTIONSHEADER = \ 65 ${ANALYSISACTIONHEADER} \66 ${ATOMACTIONHEADER} \67 ${CMDACTIONHEADER} \68 ${FRAGMENTATIONACTIONHEADER} \69 ${MOLECULEACTIONHEADER} \70 ${PARSERACTIONHEADER} \71 ${TESSELATIONACTIONHEADER} \72 ${WORLDACTIONHEADER} \73 86 Actions/Action.hpp \ 74 87 Actions/ActionHistory.hpp \ … … 88 101 Parser/ChangeTracker.cpp \ 89 102 Parser/FormatParser.cpp \ 103 Parser/FormatParserStorage.cpp \ 104 Parser/MpqcParser.cpp \ 105 Parser/PcpParser.cpp \ 90 106 Parser/TremoloParser.cpp \ 91 107 Parser/XyzParser.cpp 108 92 109 PARSERHEADER = \ 93 110 Parser/ChangeTracker.hpp \ 94 111 Parser/FormatParser.hpp \ 112 Parser/FormatParserStorage.hpp \ 113 Parser/MpqcParser.hpp \ 114 Parser/PcpParser.hpp \ 95 115 Parser/TremoloParser.hpp \ 96 116 Parser/XyzParser.hpp … … 113 133 114 134 115 # all these files are only used for legacy reasons while the transition is in progress116 # they are only needed to keep the program usable at any point of the transition and will be117 # deleted once everything is fully refactored118 LEGACYSOURCE = Legacy/oldmenu.cpp119 LEGACYHEADER = Legacy/oldmenu.hpp120 121 135 DESCRIPTORSOURCE = Descriptors/AtomDescriptor.cpp \ 122 136 Descriptors/AtomIdDescriptor.cpp \ … … 135 149 Descriptors/MoleculeNameDescriptor.hpp \ 136 150 Descriptors/MoleculePtrDescriptor.hpp 137 138 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \ 139 Exceptions/LinearDependenceException.cpp \ 140 Exceptions/MathException.cpp \ 141 Exceptions/SkewException.cpp \ 142 Exceptions/ZeroVectorException.cpp 143 144 EXCEPTIONHEADER = Exceptions/CustomException.hpp \ 145 Exceptions/LinearDependenceException.hpp \ 146 Exceptions/MathException.hpp \ 147 Exceptions/SkewException.hpp \ 148 Exceptions/ZeroVectorException.hpp 149 151 152 #TODO: Exceptionsource should go here, when the transisition makes this possible 150 153 SOURCE = \ 151 154 ${ANALYSISSOURCE} \ … … 157 160 ${DESCRIPTORSOURCE} \ 158 161 ${HELPERSOURCE} \ 159 ${LEGACYSOURCE} \160 ${EXCEPTIONSOURCE} \161 162 bond.cpp \ 162 163 bondgraph.cpp \ 163 164 boundary.cpp \ 165 Box.cpp \ 164 166 CommandLineParser.cpp \ 165 167 config.cpp \ 168 ConfigFileBuffer.cpp \ 166 169 element.cpp \ 167 170 elements_db.cpp \ … … 189 192 tesselation.cpp \ 190 193 tesselationhelpers.cpp \ 194 ThermoStatContainer.cpp \ 191 195 triangleintersectionlist.cpp \ 192 196 vector.cpp \ … … 203 207 ${SHAPEHEADER} \ 204 208 ${DESCRIPTORHEADER} \ 205 ${EXCEPTIONHEADER} \206 ${LEGACYHEADER} \207 209 bond.hpp \ 208 210 bondgraph.hpp \ 209 211 boundary.hpp \ 212 Box.hpp \ 210 213 CommandLineParser.hpp \ 211 214 config.hpp \ 215 ConfigFileBuffer.hpp \ 212 216 defs.hpp \ 213 217 element.hpp \ … … 232 236 tesselation.hpp \ 233 237 tesselationhelpers.hpp \ 238 ThermoStatContainer.hpp \ 234 239 triangleintersectionlist.hpp \ 235 240 verbose.hpp \ … … 246 251 INCLUDES = -I$(top_srcdir)/src/unittests -I$(top_srcdir)/src/Actions -I$(top_srcdir)/src/UIElements 247 252 248 noinst_LIBRARIES = libmolecuilder.a libgslwrapper.a 253 noinst_LIBRARIES = libmolecuilder.a libgslwrapper.a libparser.a 249 254 bin_PROGRAMS = molecuilder joiner analyzer 250 255 molecuilderdir = ${bindir} 251 256 libmolecuilder_a_SOURCES = ${SOURCE} ${HEADER} 257 libparser_a_SOURCES = ${PARSERSOURCE} ${PARSERHEADER} 252 258 libgslwrapper_a_SOURCES = ${LINALGSOURCE} ${LINALGHEADER} 253 259 molecuilder_DATA = elements.db valence.db orbitals.db Hbonddistance.db Hbondangle.db 254 260 molecuilder_LDFLAGS = $(BOOST_LDFLAGS) 255 261 molecuilder_SOURCES = builder.cpp 256 molecuilder_LDADD = UIElements/libMolecuilderUI.a Actions/libMolecuilderActions.a libmolecuilder.a lib gslwrapper.a $(BOOST_LIB) ${BOOST_THREAD_LIB} ${BOOST_PROGRAM_OPTIONS_LIB}262 molecuilder_LDADD = UIElements/libMolecuilderUI.a Actions/libMolecuilderActions.a libmolecuilder.a libparser.a libgslwrapper.a $(BOOST_LIB) ${BOOST_THREAD_LIB} ${BOOST_PROGRAM_OPTIONS_LIB} 257 263 joiner_SOURCES = joiner.cpp datacreator.cpp parser.cpp datacreator.hpp helpers.hpp parser.hpp periodentafel.hpp 258 264 joiner_LDADD = libmolecuilder.a $(BOOST_LIB) ${BOOST_THREAD_LIB} -
src/Parser/ChangeTracker.cpp
r0d5dce r8f822c 7 7 8 8 #include "Helpers/MemDebug.hpp" 9 #include "Parser/ChangeTracker.hpp" 10 #include "Patterns/Singleton_impl.hpp" 9 11 10 #include "ChangeTracker.hpp"11 12 ChangeTracker* ChangeTracker::instance = NULL;13 12 14 13 /** … … 27 26 ChangeTracker::~ChangeTracker() { 28 27 World::getInstance().signOff(this); 29 }30 31 /**32 * Returns the change tracker instance.33 *34 * \return this35 */36 ChangeTracker* ChangeTracker::get() {37 if (instance == NULL) {38 instance = new ChangeTracker();39 }40 41 return instance;42 }43 44 /**45 * Destroys the change tracker instance. Be careful, the change tracker is a46 * singleton and destruction might lead to a loss of consistency.47 */48 void ChangeTracker::destroy() {49 delete instance;50 instance = NULL;51 28 } 52 29 … … 76 53 } 77 54 } 55 56 CONSTRUCT_SINGLETON(ChangeTracker) -
src/Parser/ChangeTracker.hpp
r0d5dce r8f822c 18 18 * changes to it. 19 19 */ 20 class ChangeTracker : public Observable { 20 class ChangeTracker : public Singleton<ChangeTracker>, public Observable { 21 friend class Singleton<ChangeTracker>; 21 22 public: 22 23 void saveStatus(); … … 31 32 bool isConsistent; 32 33 static ChangeTracker* instance; 34 35 // private constructor and destructor due to singleton 33 36 ChangeTracker(); 34 37 ~ChangeTracker(); -
src/Parser/FormatParser.cpp
r0d5dce r8f822c 19 19 Observer("FormatParser") 20 20 { 21 ChangeTracker::get ()->signOn(this);21 ChangeTracker::getInstance().signOn(this); 22 22 saveStream = NULL; 23 23 } … … 27 27 */ 28 28 FormatParser::~FormatParser() { 29 ChangeTracker::get ()->signOff(this);29 ChangeTracker::getInstance().signOff(this); 30 30 } 31 31 -
src/Parser/TremoloParser.cpp
r0d5dce r8f822c 49 49 knownKeys["GrpTypeNo"] = TremoloKey::GrpTypeNo; 50 50 knownKeys["torsion"] = TremoloKey::torsion; 51 52 // default behavior: use all possible keys on output 53 for (std::map<std::string, TremoloKey::atomDataKey>::iterator iter = knownKeys.begin(); iter != knownKeys.end(); ++iter) 54 usedFields.push_back(iter->first); 51 55 } 52 56 … … 193 197 194 198 lineStream << line.substr(offset); 199 usedFields.clear(); 195 200 while (lineStream.good()) { 196 201 lineStream >> keyword; -
src/Parser/TremoloParser.hpp
r0d5dce r8f822c 10 10 11 11 #include <string> 12 #include " FormatParser.hpp"12 #include "Parser/FormatParser.hpp" 13 13 14 14 /** -
src/Parser/XyzParser.cpp
r0d5dce r8f822c 27 27 */ 28 28 XyzParser::~XyzParser() { 29 delete(&comment);30 29 } 31 30 … … 58 57 */ 59 58 void XyzParser::save(ostream* file) { 59 if (comment == "") { 60 time_t now = time((time_t *)NULL); // Get the system time and put it into 'now' as 'calender time' 61 comment = "\tCreated by molecuilder on "; 62 // ctime ends in \n\0, we have to cut away the newline 63 std::string time(ctime(&now)); 64 size_t pos = time.find('\n'); 65 if (pos != 0) 66 comment += time.substr(0,pos); 67 else 68 comment += time; 69 } 60 70 *file << World::getInstance().numAtoms() << endl << comment << endl; 61 71 62 72 vector<atom*> atoms = World::getInstance().getAllAtoms(); 63 73 for(vector<atom*>::iterator it = atoms.begin(); it != atoms.end(); it++) { 64 *file << fixed<< (*it)->getType()->symbol << "\t" << (*it)->x[0] << "\t" << (*it)->x[1] << "\t" << (*it)->x[2] << endl;74 *file << noshowpoint << (*it)->getType()->symbol << "\t" << (*it)->x[0] << "\t" << (*it)->x[1] << "\t" << (*it)->x[2] << endl; 65 75 } 66 76 } -
src/Parser/XyzParser.hpp
r0d5dce r8f822c 10 10 11 11 #include <string> 12 #include " FormatParser.hpp"12 #include "Parser/FormatParser.hpp" 13 13 14 14 /** -
src/Patterns/Singleton.hpp
r0d5dce r8f822c 9 9 #define SINGLETON_HPP_ 10 10 11 #include <cassert>12 11 #include <boost/thread.hpp> 13 12 13 #include "Helpers/Assert.hpp" 14 14 #include "defs.hpp" 15 15 … … 181 181 182 182 inline static void set(creator_T*&,creator_T*){ 183 assert(0 &&"Cannot set the Instance for a singleton of this type");183 ASSERT(0, "Cannot set the Instance for a singleton of this type"); 184 184 } 185 185 }; … … 191 191 struct creator_t<creator_T,false>{ 192 192 inline static creator_T* make(){ 193 assert(0 && "Cannot create a singleton of this type directly"); 193 ASSERT(0, "Cannot create a singleton of this type directly"); 194 return 0; 194 195 } 195 196 inline static void set(ptr_t& dest,creator_T* src){ -
src/Patterns/Singleton_impl.hpp
r0d5dce r8f822c 72 72 template <class T,bool _may_create> 73 73 void Singleton<T,_may_create>::setInstance(T* newInstance){ 74 assert(!theInstance.get() &&"Trying to set the instance of an already created singleton");74 ASSERT(!theInstance.get(), "Trying to set the instance of an already created singleton"); 75 75 boost::recursive_mutex::scoped_lock guard(instanceLock); 76 76 theInstance.reset(newInstance); … … 83 83 template <class T, bool _may_create> 84 84 Singleton<T,_may_create>::Singleton(const Singleton<T,_may_create>&){ 85 assert(0 &&"Copy constructor of singleton template called");85 ASSERT(0, "Copy constructor of singleton template called"); 86 86 } 87 87 -
src/UIElements/CommandLineUI/CommandLineDialog.cpp
r0d5dce r8f822c 27 27 #include "verbose.hpp" 28 28 #include "World.hpp" 29 #include "Box.hpp" 29 30 30 31 #include "atom.hpp" … … 73 74 } 74 75 75 void CommandLineDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string _description) {76 registerQuery(new VectorCommandLineQuery(title,target,c ellSize,check, _description));77 } 78 79 void CommandLineDialog::queryBox(const char* title, double ** constcellSize, string _description) {76 void CommandLineDialog::queryVector(const char* title, Vector *target, bool check, string _description) { 77 registerQuery(new VectorCommandLineQuery(title,target,check, _description)); 78 } 79 80 void CommandLineDialog::queryBox(const char* title, Box* cellSize, string _description) { 80 81 registerQuery(new BoxCommandLineQuery(title,cellSize,_description)); 81 82 } … … 202 203 } 203 204 204 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, const double *const _cellSize,bool _check, string _description) :205 Dialog::VectorQuery(title,_target,_c ellSize,_check, _description)205 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, bool _check, string _description) : 206 Dialog::VectorQuery(title,_target,_check, _description) 206 207 {} 207 208 … … 224 225 225 226 226 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, double ** const_cellSize, string _description) :227 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, Box* _cellSize, string _description) : 227 228 Dialog::BoxQuery(title,_cellSize, _description) 228 229 {} -
src/UIElements/CommandLineUI/CommandLineDialog.hpp
r0d5dce r8f822c 34 34 virtual void queryAtom(const char*,atom**, std::string = ""); 35 35 virtual void queryMolecule(const char*,molecule**,std::string = ""); 36 virtual void queryVector(const char*,Vector *, const double * const,bool, std::string = "");37 virtual void queryBox(const char*, double ** const, std::string = "");36 virtual void queryVector(const char*,Vector *,bool, std::string = ""); 37 virtual void queryBox(const char*,Box *, std::string = ""); 38 38 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 39 39 … … 91 91 class VectorCommandLineQuery : public Dialog::VectorQuery { 92 92 public: 93 VectorCommandLineQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = "");93 VectorCommandLineQuery(std::string title,Vector *_target,bool _check, std::string _description = ""); 94 94 virtual ~VectorCommandLineQuery(); 95 95 virtual bool handle(); … … 98 98 class BoxCommandLineQuery : public Dialog::BoxQuery { 99 99 public: 100 BoxCommandLineQuery(std::string title, double ** const_cellSize, std::string _description = "");100 BoxCommandLineQuery(std::string title,Box* _cellSize, std::string _description = ""); 101 101 virtual ~BoxCommandLineQuery(); 102 102 virtual bool handle(); -
src/UIElements/CommandLineUI/CommandLineWindow.cpp
r0d5dce r8f822c 13 13 #include "CommandLineUI/CommandLineStatusIndicator.hpp" 14 14 15 #include "Actions/Action.hpp" 16 #include "Actions/MapOfActions.hpp" 15 17 #include "Actions/ActionRegistry.hpp" 16 #include "Actions/AnalysisAction/MolecularVolumeAction.hpp" 17 #include "Actions/AnalysisAction/PairCorrelationAction.hpp" 18 #include "Actions/AnalysisAction/PrincipalAxisSystemAction.hpp" 19 #include "Actions/AtomAction/AddAction.hpp" 20 #include "Actions/AtomAction/ChangeElementAction.hpp" 21 #include "Actions/AtomAction/RemoveAction.hpp" 22 #include "Actions/CmdAction/BondLengthTableAction.hpp" 23 #include "Actions/CmdAction/ElementDbAction.hpp" 24 #include "Actions/CmdAction/FastParsingAction.hpp" 25 #include "Actions/CmdAction/HelpAction.hpp" 26 #include "Actions/CmdAction/VerboseAction.hpp" 27 #include "Actions/CmdAction/VersionAction.hpp" 28 #include "Actions/FragmentationAction/DepthFirstSearchAction.hpp" 29 #include "Actions/FragmentationAction/SubgraphDissectionAction.hpp" 30 #include "Actions/FragmentationAction/FragmentationAction.hpp" 31 #include "Actions/MoleculeAction/BondFileAction.hpp" 32 #include "Actions/MoleculeAction/ChangeNameAction.hpp" 33 #include "Actions/MoleculeAction/FillWithMoleculeAction.hpp" 34 #include "Actions/MoleculeAction/LinearInterpolationofTrajectoriesAction.hpp" 35 #include "Actions/MoleculeAction/SaveAdjacencyAction.hpp" 36 #include "Actions/MoleculeAction/SaveBondsAction.hpp" 37 #include "Actions/MoleculeAction/SaveTemperatureAction.hpp" 38 #include "Actions/MoleculeAction/TranslateAction.hpp" 39 #include "Actions/MoleculeAction/VerletIntegrationAction.hpp" 40 #include "Actions/ParserAction/LoadXyzAction.hpp" 41 #include "Actions/ParserAction/SaveXyzAction.hpp" 42 #include "Actions/TesselationAction/ConvexEnvelopeAction.hpp" 43 #include "Actions/TesselationAction/NonConvexEnvelopeAction.hpp" 44 #include "Actions/WorldAction/AddEmptyBoundaryAction.hpp" 45 #include "Actions/WorldAction/BoundInBoxAction.hpp" 46 #include "Actions/WorldAction/CenterInBoxAction.hpp" 47 #include "Actions/WorldAction/CenterOnEdgeAction.hpp" 48 #include "Actions/WorldAction/ChangeBoxAction.hpp" 49 #include "Actions/WorldAction/RemoveSphereOfAtomsAction.hpp" 50 #include "Actions/WorldAction/RepeatBoxAction.hpp" 51 #include "Actions/WorldAction/ScaleBoxAction.hpp" 52 #include "Actions/WorldAction/SetDefaultNameAction.hpp" 53 #include "Actions/WorldAction/SetGaussianBasisAction.hpp" 18 54 19 #include "CommandLineParser.hpp" 55 20 … … 62 27 { 63 28 // create and register all command line callable actions 64 populateAnalysisActions(); 65 populateAtomActions(); 66 populateCmdActions(); 67 populateFragmentationActions(); 68 populateMoleculeActions(); 69 populateParserActions(); 70 populateTesselationActions(); 71 populateWorldActions(); 29 MapOfActions::getInstance().populateActions(); 72 30 73 31 // Add status indicators etc... … … 81 39 82 40 void CommandLineWindow::display() { 41 //cout << ActionRegistry::getInstance(); 42 83 43 // go through all possible actions 84 44 for (std::list<std::string>::iterator CommandRunner = CommandLineParser::getInstance().SequenceOfActions.begin(); CommandRunner != CommandLineParser::getInstance().SequenceOfActions.end(); ++CommandRunner) { 85 cout << "Checking presence of " << *CommandRunner << endl; 86 if (ActionRegistry::getInstance().isActionByNamePresent(*CommandRunner)) 45 cout << "Checking presence of " << *CommandRunner << ": "; 46 if (ActionRegistry::getInstance().isActionByNamePresent(*CommandRunner)) { 47 cout << "calling " << *CommandRunner << endl; 87 48 ActionRegistry::getInstance().getActionByName(*CommandRunner)->call(); 49 } else { 50 cout << "absent." << endl; 51 } 88 52 } 89 53 } 90 54 91 void CommandLineWindow::populateAnalysisActions()92 {93 new AnalysisMolecularVolumeAction();94 new AnalysisPairCorrelationAction();95 new AnalysisPrincipalAxisSystemAction();96 }97 98 void CommandLineWindow::populateAtomActions()99 {100 new AtomAddAction();101 new AtomChangeElementAction();102 new AtomRemoveAction();103 }104 105 void CommandLineWindow::populateCmdActions()106 {107 new CommandLineBondLengthTableAction();108 new CommandLineElementDbAction();109 new CommandLineFastParsingAction();110 new CommandLineHelpAction();111 new CommandLineVerboseAction();112 new CommandLineVersionAction();113 }114 115 void CommandLineWindow::populateFragmentationActions()116 {117 new FragmentationDepthFirstSearchAction();118 new FragmentationFragmentationAction();119 new FragmentationSubgraphDissectionAction();120 }121 122 void CommandLineWindow::populateMoleculeActions()123 {124 new MoleculeBondFileAction();125 new MoleculeChangeNameAction();126 new MoleculeFillWithMoleculeAction();127 new MoleculeLinearInterpolationofTrajectoriesAction();128 new MoleculeSaveAdjacencyAction();129 new MoleculeSaveBondsAction();130 new MoleculeSaveTemperatureAction();131 new MoleculeTranslateAction();132 new MoleculeVerletIntegrationAction();133 }134 135 void CommandLineWindow::populateParserActions()136 {137 new ParserLoadXyzAction();138 new ParserSaveXyzAction();139 }140 141 void CommandLineWindow::populateTesselationActions()142 {143 new TesselationConvexEnvelopeAction();144 new TesselationNonConvexEnvelopeAction();145 }146 147 void CommandLineWindow::populateWorldActions()148 {149 new WorldAddEmptyBoundaryAction();150 new WorldBoundInBoxAction();151 new WorldCenterInBoxAction();152 new WorldCenterOnEdgeAction();153 new WorldChangeBoxAction();154 new WorldRemoveSphereOfAtomsAction();155 new WorldRepeatBoxAction();156 new WorldScaleBoxAction();157 new WorldSetDefaultNameAction();158 new WorldSetGaussianBasisAction();159 } -
src/UIElements/Dialog.cpp
r0d5dce r8f822c 8 8 #include "Helpers/MemDebug.hpp" 9 9 10 #include <cassert>11 12 10 #include "Dialog.hpp" 13 11 … … 16 14 #include "molecule.hpp" 17 15 #include "vector.hpp" 16 #include "Matrix.hpp" 17 #include "Box.hpp" 18 18 19 19 using namespace std; … … 164 164 // Vector Queries 165 165 166 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description) :166 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,bool _check, std::string _description) : 167 167 Query(title, _description), 168 cellSize(_cellSize),169 168 check(_check), 170 169 target(_target) … … 184 183 // Box Queries 185 184 186 Dialog::BoxQuery::BoxQuery(std::string title, double ** const_cellSize, std::string _description) :185 Dialog::BoxQuery::BoxQuery(std::string title, Box* _cellSize, std::string _description) : 187 186 Query(title, _description), 188 187 target(_cellSize) … … 197 196 198 197 void Dialog::BoxQuery::setResult() { 199 for (int i=0;i<6;i++) { 200 (*target)[i] = tmp[i]; 201 } 198 (*target)= ReturnFullMatrixforSymmetric(tmp); 202 199 } 203 200 -
src/UIElements/Dialog.hpp
r0d5dce r8f822c 14 14 15 15 class atom; 16 class Box; 16 17 class element; 17 18 class molecule; … … 31 32 virtual void queryAtom(const char*,atom**,std::string = "")=0; 32 33 virtual void queryMolecule(const char*,molecule**, std::string = "")=0; 33 virtual void queryVector(const char*,Vector *, const double *const,bool, std::string = "")=0;34 virtual void queryBox(const char*, double ** const, std::string = "")=0;34 virtual void queryVector(const char*,Vector *,bool, std::string = "")=0; 35 virtual void queryBox(const char*,Box*, std::string = "")=0; 35 36 virtual void queryElement(const char*, std::vector<element *> *, std::string = "")=0; 36 37 … … 148 149 class VectorQuery : public Query { 149 150 public: 150 VectorQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = "");151 VectorQuery(std::string title,Vector *_target,bool _check, std::string _description = ""); 151 152 virtual ~VectorQuery(); 152 153 virtual bool handle()=0; … … 154 155 protected: 155 156 Vector *tmp; 156 const double *const cellSize;157 157 bool check; 158 158 private: … … 162 162 class BoxQuery : public Query { 163 163 public: 164 BoxQuery(std::string title, double ** const_cellSize, std::string _description = "");164 BoxQuery(std::string title,Box *_cellSize, std::string _description = ""); 165 165 virtual ~BoxQuery(); 166 166 virtual bool handle()=0; 167 167 virtual void setResult(); 168 168 protected: 169 double *tmp;169 double* tmp; 170 170 private: 171 double **target;171 Box* target; 172 172 }; 173 173 -
src/UIElements/TextUI/TextDialog.cpp
r0d5dce r8f822c 25 25 #include "molecule.hpp" 26 26 #include "vector.hpp" 27 #include "Matrix.hpp" 28 #include "Box.hpp" 27 29 28 30 using namespace std; … … 66 68 } 67 69 68 void TextDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string description) {69 registerQuery(new VectorTextQuery(title,target,c ellSize,check,description));70 } 71 72 void TextDialog::queryBox(const char* title, double ** constcellSize, string description) {70 void TextDialog::queryVector(const char* title, Vector *target, bool check, string description) { 71 registerQuery(new VectorTextQuery(title,target,check,description)); 72 } 73 74 void TextDialog::queryBox(const char* title,Box* cellSize, string description) { 73 75 registerQuery(new BoxTextQuery(title,cellSize,description)); 74 76 } … … 243 245 } 244 246 245 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize,bool _check, std::string _description) :246 Dialog::VectorQuery(title,_target,_c ellSize,_check,_description)247 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, bool _check, std::string _description) : 248 Dialog::VectorQuery(title,_target,_check,_description) 247 249 {} 248 250 … … 253 255 Log() << Verbose(0) << getTitle(); 254 256 257 const Matrix &M = World::getInstance().getDomain().getM(); 255 258 char coords[3] = {'x','y','z'}; 256 int j = -1;257 259 for (int i=0;i<3;i++) { 258 j += i+1;259 260 do { 260 Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j]<< "]: ";261 Log() << Verbose(0) << coords[i] << "[0.." << M.at(i,i) << "]: "; 261 262 cin >> (*tmp)[i]; 262 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check));263 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= M.at(i,i))) && (check)); 263 264 } 264 265 return true; 265 266 } 266 267 267 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const_cellSize, std::string _description) :268 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, Box* _cellSize, std::string _description) : 268 269 Dialog::BoxQuery(title,_cellSize,_description) 269 270 {} -
src/UIElements/TextUI/TextDialog.hpp
r0d5dce r8f822c 31 31 virtual void queryAtom(const char*,atom**,std::string = ""); 32 32 virtual void queryMolecule(const char*,molecule**,std::string = ""); 33 virtual void queryVector(const char*,Vector *, const double * const,bool, std::string = "");34 virtual void queryBox(const char*, double ** const, std::string = "");33 virtual void queryVector(const char*,Vector *,bool, std::string = ""); 34 virtual void queryBox(const char*,Box*, std::string = ""); 35 35 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 36 36 … … 88 88 class VectorTextQuery : public Dialog::VectorQuery { 89 89 public: 90 VectorTextQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = NULL);90 VectorTextQuery(std::string title,Vector *_target,bool _check, std::string _description = NULL); 91 91 virtual ~VectorTextQuery(); 92 92 virtual bool handle(); … … 95 95 class BoxTextQuery : public Dialog::BoxQuery { 96 96 public: 97 BoxTextQuery(std::string title, double ** const_cellSize, std::string _description = NULL);97 BoxTextQuery(std::string title,Box* _cellSize, std::string _description = NULL); 98 98 virtual ~BoxTextQuery(); 99 99 virtual bool handle(); -
src/UIElements/TextUI/TextWindow.cpp
r0d5dce r8f822c 12 12 #include <boost/bind.hpp> 13 13 14 15 // TODO: When done with refactoring most of these wont be needed anymore16 #include "analysis_correlation.hpp"17 #include "atom.hpp"18 #include "bond.hpp"19 #include "bondgraph.hpp"20 #include "boundary.hpp"21 #include "config.hpp"22 #include "element.hpp"23 #include "ellipsoid.hpp"24 #include "helpers.hpp"25 #include "leastsquaremin.hpp"26 #include "linkedcell.hpp"27 #include "log.hpp"28 #include "memoryusageobserver.hpp"29 #include "molecule.hpp"30 #include "periodentafel.hpp"31 #include "World.hpp"32 33 #include "Legacy/oldmenu.hpp"34 35 14 #include "Menu/Menu.hpp" 36 15 #include "Menu/TextMenu.hpp" … … 40 19 #include "Menu/SubMenuItem.hpp" 41 20 #include "TextUI/TextStatusIndicator.hpp" 21 #include "Actions/MapOfActions.hpp" 42 22 #include "Actions/MethodAction.hpp" 43 #include "Actions/MoleculeAction/ChangeNameAction.hpp"44 23 #include "Actions/ErrorAction.hpp" 45 24 #include "Actions/ActionRegistry.hpp" … … 47 26 #include "Views/MethodStringView.hpp" 48 27 28 #include "defs.hpp" 29 #include "log.hpp" 30 #include "verbose.hpp" 31 32 // all needed due to config::SaveAll() 33 #include "config.hpp" 34 #include "periodentafel.hpp" 35 36 // config::SaveAll() and enumerate() 37 #include "molecule.hpp" 38 49 39 #include <iostream> 40 #include <map> 50 41 51 42 using namespace std; … … 54 45 TextWindow::TextWindow() 55 46 { 56 MoleculeListClass *molecules = World::getInstance().getMolecules();57 config *configuration = World::getInstance().getConfig();58 periodentafel *periode = World::getInstance().getPeriode(); 59 char *ConfigFileName = NULL;60 old_menu = new oldmenu;47 char ConfigFileName[MAXSTRINGSIZE]; 48 map <std::string, TextMenu *> NametoTextMenuMap; 49 50 // populate all actions 51 MapOfActions::getInstance().populateActions(); 61 52 62 53 // build the main menu 63 54 main_menu = new TextMenu(Log() << Verbose(0), "Main Menu"); 64 55 65 moleculeView = new StreamStringView(boost::bind(&MoleculeListClass::Enumerate, molecules,_1));56 moleculeView = new StreamStringView(boost::bind(&MoleculeListClass::Enumerate,World::getInstance().getMolecules(),_1)); 66 57 new DisplayMenuItem(main_menu,moleculeView,"Molecule List"); 67 58 … … 76 67 new SeperatorItem(main_menu); 77 68 78 Action *setMoleculeAction = new MethodAction("setMoleculeAction",boost::bind(&MoleculeListClass::flipChosen, molecules));69 Action *setMoleculeAction = new MethodAction("setMoleculeAction",boost::bind(&MoleculeListClass::flipChosen,World::getInstance().getMolecules())); 79 70 new ActionMenuItem('a',"set molecule (in)active",main_menu,setMoleculeAction); 80 71 81 TextMenu *editMoleculesMenu = new TextMenu(Log() << Verbose(0), "Edit Molecules"); 82 new SubMenuItem('e',"edit molecules (load, parse, save)",main_menu,editMoleculesMenu); 72 TextMenu *AnalysisMenu = new TextMenu(Log() << Verbose(0), "Analysis"); 73 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("analysis", AnalysisMenu) ); 74 new SubMenuItem('A',"Analysis (pair correlation, volume)",main_menu,AnalysisMenu); 83 75 84 Action *manipulateMoleculeAction = new MethodAction("manipulateMoleculeAction",boost::bind(&oldmenu::ManipulateMolecules,old_menu,periode, molecules, configuration)); 85 new ActionMenuItem('g',"globally manipulate atoms in molecule",main_menu,manipulateMoleculeAction); 76 TextMenu *CommandMenu = new TextMenu(Log() << Verbose(0), "Configuration"); 77 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("command", CommandMenu) ); 78 new SubMenuItem('c',"configuration",main_menu,CommandMenu); 86 79 87 Action *mergeMoleculeAction = new MethodAction("mergeMoleculeAction",boost::bind(&oldmenu::MergeMolecules,old_menu,periode, molecules)); 88 new ActionMenuItem('M',"Merge molecules",main_menu,mergeMoleculeAction); 80 TextMenu *AtomMenu = new TextMenu(Log() << Verbose(0), "Atoms"); 81 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("atom", AtomMenu) ); 82 new SubMenuItem('e',"edit atoms",main_menu,AtomMenu); 89 83 90 Action *manipulateAtomsAction = new MethodAction("manipulateAtomsAction",boost::bind(&oldmenu::ManipulateAtoms,old_menu,periode, molecules, configuration)); 91 new ActionMenuItem('m',"manipulate atoms",main_menu,manipulateAtomsAction); 84 TextMenu *FragmentationMenu = new TextMenu(Log() << Verbose(0), "Fragmentation"); 85 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("fragmentation", FragmentationMenu) ); 86 new SubMenuItem('f',"fragmentation",main_menu,FragmentationMenu); 87 88 TextMenu *ParserMenu = new TextMenu(Log() << Verbose(0), "Parse files"); 89 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("parser", ParserMenu) ); 90 new SubMenuItem('p',"parse files into system",main_menu,ParserMenu); 91 92 TextMenu *MoleculesMenu = new TextMenu(Log() << Verbose(0), "Edit Molecules"); 93 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("analysis", AnalysisMenu) ); 94 new SubMenuItem('m',"edit molecules (load, parse, save)",main_menu,MoleculesMenu); 95 96 TextMenu *TesselationMenu = new TextMenu(Log() << Verbose(0), "Tesselate Molecules"); 97 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("tesselation", TesselationMenu) ); 98 new SubMenuItem('t',"tesselate molecules",main_menu,TesselationMenu); 99 100 TextMenu *WorldMenu = new TextMenu(Log() << Verbose(0), "World"); 101 NametoTextMenuMap.insert( pair <std::string, TextMenu *> ("world", WorldMenu) ); 102 new SubMenuItem('w',"edit world",main_menu,WorldMenu); 92 103 93 104 new SeperatorItem(main_menu); 94 105 95 Action *editConfigAction = new MethodAction("editConfigAction",boost::bind(&config::Edit,configuration)); 96 new ActionMenuItem('c',"edit the current configuration",main_menu,editConfigAction); 97 98 new SeperatorItem(main_menu); 99 100 Action *saveConfigAction = new MethodAction("saveConfigAction",boost::bind(&config::SaveAll,configuration, ConfigFileName, periode, molecules)); 106 Action *saveConfigAction = new MethodAction("saveConfigAction",boost::bind(&config::SaveAll,World::getInstance().getConfig(), ConfigFileName, World::getInstance().getPeriode(), World::getInstance().getMolecules())); 101 107 new ActionMenuItem('s',"save current setup to config file",main_menu,saveConfigAction); 102 103 Action *doTestAction = new MethodAction("doTestAction",boost::bind(&oldmenu::testroutine,old_menu,molecules));104 new ActionMenuItem('T',"call the current test routine",main_menu,doTestAction);105 108 106 109 quitAction = new MethodAction("quitAction",boost::bind(&TextMenu::doQuit,main_menu),false); 107 110 new ActionMenuItem('q',"quit",main_menu,quitAction); 108 111 109 // call all functions used to build the submenus 110 111 populateEditMoleculesMenu(editMoleculesMenu); 112 113 Action *returnFromEditMoleculeAction = new TextMenu::LeaveAction(editMoleculesMenu); 114 MenuItem *returnItem = new ActionMenuItem('q',"return to Main menu",editMoleculesMenu,returnFromEditMoleculeAction); 115 116 editMoleculesMenu->addDefault(returnItem); 112 // go through all menus and create them 113 for (map <std::string, TextMenu *>::iterator MenuRunner = NametoTextMenuMap.begin(); MenuRunner != NametoTextMenuMap.end(); ++MenuRunner) { 114 cout << "Creating Menu " << MenuRunner->first << "." << endl; 115 populateMenu(MenuRunner->second, MenuRunner->first); 116 } 117 117 118 118 // Add status indicators etc... … … 123 123 TextWindow::~TextWindow() 124 124 { 125 delete old_menu;126 125 delete quitAction; 127 126 delete moleculeView; … … 134 133 } 135 134 136 void TextWindow::populateEditMoleculesMenu(Menu* editMoleculesMenu) 135 char TextWindow::getSuitableShortForm(set <char> &ShortcutList, const std::string name) const 137 136 { 138 MoleculeListClass *molecules = World::getInstance().getMolecules(); 139 periodentafel *periode = World::getInstance().getPeriode(); 137 for (std::string::const_iterator CharRunner = name.begin(); CharRunner != name.end(); ++CharRunner) { 138 if (ShortcutList.find(*CharRunner) == ShortcutList.end()) 139 return *CharRunner; 140 } 141 DoeLog(1) && (eLog() << Verbose(1) << "Could not find a suitable shortform for TextWindow::getSuitableShortForm()." << endl); 142 return ((char)(ShortcutList.size() % 10) + '0'); 143 } 140 144 141 // build the EditMoleculesMenu 142 Action *createMoleculeAction = new MethodAction("createMoleculeAction",boost::bind(&MoleculeListClass::createNewMolecule,molecules,periode)); 143 new ActionMenuItem('c',"create new molecule",editMoleculesMenu,createMoleculeAction); 144 145 Action *loadMoleculeAction = new MethodAction("loadMoleculeAction",boost::bind(&MoleculeListClass::loadFromXYZ,molecules,periode)); 146 new ActionMenuItem('l',"load molecule from xyz file",editMoleculesMenu,loadMoleculeAction); 147 148 Action *changeFilenameAction = new MoleculeChangeNameAction(); 149 new ActionMenuItem('n',"change molecule's name",editMoleculesMenu,changeFilenameAction); 150 151 Action *giveFilenameAction = new MethodAction("giveFilenameAction",boost::bind(&MoleculeListClass::setMoleculeFilename,molecules)); 152 new ActionMenuItem('N',"give molecules filename",editMoleculesMenu,giveFilenameAction); 153 154 Action *parseAtomsAction = new MethodAction("parseAtomsAction",boost::bind(&MoleculeListClass::parseXYZIntoMolecule,molecules)); 155 new ActionMenuItem('p',"parse atoms in xyz file into molecule",editMoleculesMenu,parseAtomsAction); 156 157 Action *eraseMoleculeAction = new MethodAction("eraseMoleculeAction",boost::bind(&MoleculeListClass::eraseMolecule,molecules)); 158 new ActionMenuItem('r',"remove a molecule",editMoleculesMenu,eraseMoleculeAction); 159 145 void TextWindow::populateMenu(TextMenu* Menu, const std::string &MenuName) 146 { 147 Action *ActionItem = NULL; 148 set <char> ShortcutList; 149 // through all actions for this menu 150 pair < multimap <std::string, std::string>::iterator, multimap <std::string, std::string>::iterator > MenuActions = MapOfActions::getInstance().MenuContainsActionMap.equal_range(MenuName); 151 for (multimap <std::string, std::string>::const_iterator MenuRunner = MenuActions.first; MenuRunner != MenuActions.second; ++MenuRunner) { 152 cout << " Adding " << MenuRunner->second << " to submenu " << MenuName << endl; 153 ActionItem = ActionRegistry::getInstance().getActionByName(MenuRunner->second); 154 new ActionMenuItem(getSuitableShortForm(ShortcutList, MenuRunner->second),MapOfActions::getInstance().getDescription(MenuRunner->second).c_str(),Menu,ActionItem); 155 } 156 // finally add default quit item 157 Action *returnFromAction = new TextMenu::LeaveAction(Menu); 158 MenuItem *returnFromItem = new ActionMenuItem('q',"return to Main menu",Menu,returnFromAction); 159 Menu->addDefault(returnFromItem); 160 160 } -
src/UIElements/TextUI/TextWindow.hpp
r0d5dce r8f822c 11 11 #include "MainWindow.hpp" 12 12 13 #include <string> 14 #include <set> 15 13 16 class TextMenu; 14 17 class Action; 15 class oldmenu;16 18 class StringView; 17 19 class TextStatusIndicator; … … 27 29 private: 28 30 // populaters 29 void populateEditMoleculesMenu(Menu* editMoleculesMenu); 31 char getSuitableShortForm(std::set <char> &ShortcutList, const std::string name) const; 32 void populateMenu(TextMenu* Menu, const std::string &name); 30 33 31 34 TextMenu *main_menu; … … 36 39 StringView *moleculeView; 37 40 TextStatusIndicator *statusIndicator; 38 39 // This class still contains a lot of scattered functionality40 oldmenu *old_menu;41 41 }; 42 42 -
src/VectorSet.hpp
r0d5dce r8f822c 12 12 #include <functional> 13 13 #include <algorithm> 14 #include <limits> 14 15 15 16 /** … … 19 20 */ 20 21 21 class Vector; 22 #include "vector.hpp" 23 #include <list> 22 24 23 25 // this tests, whether we actually have a Vector … … 48 50 void translate(const Vector &translater){ 49 51 // this is needed to allow template lookup 50 transform(this->begin(),this->end(),this->begin(),bind1st(plus<Vector>(),translater)); 52 transform(this->begin(),this->end(),this->begin(),std::bind1st(std::plus<Vector>(),translater)); 53 } 54 55 double minDistSquared(const Vector &point){ 56 if(!this->size()) 57 return std::numeric_limits<double>::infinity(); 58 std::list<double> helper; 59 helper.resize(this->size()); 60 transform(this->begin(),this->end(), 61 helper.begin(), 62 std::bind2nd(std::mem_fun_ref(&Vector::DistanceSquared),point)); 63 return *min_element(helper.begin(),helper.end()); 51 64 } 52 65 }; 53 66 67 // allows simpler definition of VectorSets 68 #define VECTORSET(container_type) VectorSet<container_type<Vector> > 69 54 70 #endif /* VECTORSET_HPP_ */ -
src/World.cpp
r0d5dce r8f822c 14 14 #include "molecule.hpp" 15 15 #include "periodentafel.hpp" 16 #include "ThermoStatContainer.hpp" 16 17 #include "Descriptors/AtomDescriptor.hpp" 17 18 #include "Descriptors/AtomDescriptor_impl.hpp" … … 20 21 #include "Descriptors/SelectiveIterator_impl.hpp" 21 22 #include "Actions/ManipulateAtomsProcess.hpp" 23 #include "Helpers/Assert.hpp" 24 #include "Box.hpp" 25 #include "Matrix.hpp" 22 26 23 27 #include "Patterns/Singleton_impl.hpp" … … 72 76 // system 73 77 74 double * World::getDomain() { 75 return cell_size; 78 Box& World::getDomain() { 79 return *cell_size; 80 } 81 82 void World::setDomain(const Matrix &mat){ 83 *cell_size = mat; 76 84 } 77 85 78 86 void World::setDomain(double * matrix) 79 87 { 80 88 Matrix M = ReturnFullMatrixforSymmetric(matrix); 89 cell_size->setM(M); 81 90 } 82 91 … … 89 98 defaultName = name; 90 99 }; 100 101 class ThermoStatContainer * World::getThermostats() 102 { 103 return Thermostats; 104 } 105 91 106 92 107 int World::getExitFlag() { … … 105 120 molecule *mol = NULL; 106 121 mol = NewMolecule(); 107 assert(!molecules.count(currMoleculeId));122 ASSERT(!molecules.count(currMoleculeId),"currMoleculeId did not specify an unused ID"); 108 123 mol->setId(currMoleculeId++); 109 124 // store the molecule by ID … … 121 136 OBSERVE; 122 137 molecule *mol = molecules[id]; 123 assert(mol);138 ASSERT(mol,"Molecule id that was meant to be destroyed did not exist"); 124 139 DeleteMolecule(mol); 125 140 molecules.erase(id); 126 141 } 127 128 double *World::cell_size = NULL;129 142 130 143 atom *World::createAtom(){ … … 157 170 OBSERVE; 158 171 atom *atom = atoms[id]; 159 assert(atom);172 ASSERT(atom,"Atom ID that was meant to be destroyed did not exist"); 160 173 DeleteAtom(atom); 161 174 atoms.erase(id); … … 169 182 if(!target){ 170 183 target = atoms[oldId]; 171 assert(target &&"Atom with that ID not found");184 ASSERT(target,"Atom with that ID not found"); 172 185 return target->changeId(newId); 173 186 } … … 281 294 periode(new periodentafel), 282 295 configuration(new config), 296 Thermostats(new ThermoStatContainer), 283 297 ExitFlag(0), 284 298 atoms(), … … 288 302 molecules_deprecated(new MoleculeListClass(this)) 289 303 { 290 cell_size = new double[6]; 291 cell_size[0] = 20.; 292 cell_size[1] = 0.; 293 cell_size[2] = 20.; 294 cell_size[3] = 0.; 295 cell_size[4] = 0.; 296 cell_size[5] = 20.; 304 cell_size = new Box; 305 Matrix domain; 306 domain.at(0,0) = 20; 307 domain.at(1,1) = 20; 308 domain.at(2,2) = 20; 309 cell_size->setM(domain); 297 310 defaultName = "none"; 298 311 molecules_deprecated->signOn(this); … … 302 315 { 303 316 molecules_deprecated->signOff(this); 304 delete []cell_size;317 delete cell_size; 305 318 delete molecules_deprecated; 306 319 delete periode; 307 320 delete configuration; 321 delete Thermostats; 308 322 MoleculeSet::iterator molIter; 309 323 for(molIter=molecules.begin();molIter!=molecules.end();++molIter){ -
src/World.hpp
r0d5dce r8f822c 30 30 31 31 // forward declarations 32 class config;33 class periodentafel;34 class MoleculeListClass;35 32 class atom; 36 class molecule;37 33 class AtomDescriptor; 38 34 class AtomDescriptor_impl; 35 template<typename T> class AtomsCalculation; 36 class Box; 37 class config; 38 class ManipulateAtomsProcess; 39 class Matrix; 40 class molecule; 39 41 class MoleculeDescriptor; 40 42 class MoleculeDescriptor_impl; 41 class M anipulateAtomsProcess;42 template<typename T> 43 class AtomsCalculation;43 class MoleculeListClass; 44 class periodentafel; 45 class ThermoStatContainer; 44 46 45 47 /****************************************** forward declarations *****************************/ … … 125 127 * get the domain size as a symmetric matrix (6 components) 126 128 */ 127 double * getDomain(); 129 Box& getDomain(); 130 131 /** 132 * Set the domain size from a matrix object 133 * 134 * Matrix needs to be symmetric 135 */ 136 void setDomain(const Matrix &mat); 128 137 129 138 /** … … 141 150 */ 142 151 void setDefaultName(std::string name); 152 153 /** 154 * get pointer to World's ThermoStatContainer 155 */ 156 ThermoStatContainer * getThermostats(); 143 157 144 158 /* … … 252 266 periodentafel *periode; 253 267 config *configuration; 254 static double*cell_size;268 Box *cell_size; 255 269 std::string defaultName; 270 class ThermoStatContainer *Thermostats; 256 271 int ExitFlag; 257 272 public: -
src/analysis_correlation.cpp
r0d5dce r8f822c 19 19 #include "triangleintersectionlist.hpp" 20 20 #include "vector.hpp" 21 #include "Matrix.hpp" 21 22 #include "verbose.hpp" 22 23 #include "World.hpp" 24 #include "Box.hpp" 23 25 24 26 … … 34 36 PairCorrelationMap *outmap = NULL; 35 37 double distance = 0.; 36 double *domain = World::getInstance().getDomain();38 Box &domain = World::getInstance().getDomain(); 37 39 38 40 if (molecules->ListOfMolecules.empty()) { … … 75 77 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 76 78 if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) { 77 distance = (*iter)->node->PeriodicDistance(*(*runner)->node, domain);79 distance = domain.periodicDistance(*(*iter)->node,*(*runner)->node); 78 80 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; 79 81 outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> ((*iter), (*runner)) ) ); … … 135 137 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++){ 136 138 if ((*MolWalker)->ActiveFlag) { 137 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());138 double * FullInverseMatrix = InverseMatrix(FullMatrix);139 Matrix FullMatrix = World::getInstance().getDomain().getM(); 140 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 139 141 DoeLog(2) && (eLog()<< Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 140 142 eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl; 141 143 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { 142 144 DoLog(3) && (Log() << Verbose(3) << "Current atom is " << **iter << "." << endl); 143 periodicX = *(*iter)->node; 144 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 145 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 145 146 // go through every range in xyz and get distance 146 147 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 147 148 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 148 149 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 149 checkX = Vector(n[0], n[1], n[2]) + periodicX; 150 checkX.MatrixMultiplication(FullMatrix); 150 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 151 151 for (MoleculeList::const_iterator MolOtherWalker = MolWalker; MolOtherWalker != molecules->ListOfMolecules.end(); MolOtherWalker++){ 152 152 if ((*MolOtherWalker)->ActiveFlag) { … … 157 157 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 158 158 if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) { 159 periodicOtherX = *(*runner)->node; 160 periodicOtherX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 159 periodicOtherX = FullInverseMatrix * (*(*runner)->node); // x now in [0,1)^3 161 160 // go through every range in xyz and get distance 162 161 for (Othern[0]=-ranges[0]; Othern[0] <= ranges[0]; Othern[0]++) 163 162 for (Othern[1]=-ranges[1]; Othern[1] <= ranges[1]; Othern[1]++) 164 163 for (Othern[2]=-ranges[2]; Othern[2] <= ranges[2]; Othern[2]++) { 165 checkOtherX = Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX; 166 checkOtherX.MatrixMultiplication(FullMatrix); 164 checkOtherX = FullMatrix * (Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX); 167 165 distance = checkX.distance(checkOtherX); 168 166 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; … … 176 174 } 177 175 } 178 delete[](FullMatrix);179 delete[](FullInverseMatrix);180 176 } 181 177 } … … 195 191 CorrelationToPointMap *outmap = NULL; 196 192 double distance = 0.; 197 double *cell_size= World::getInstance().getDomain();193 Box &domain = World::getInstance().getDomain(); 198 194 199 195 if (molecules->ListOfMolecules.empty()) { … … 211 207 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 212 208 if ((*type == NULL) || ((*iter)->type == *type)) { 213 distance = (*iter)->node->PeriodicDistance(*point, cell_size);209 distance = domain.periodicDistance(*(*iter)->node,*point); 214 210 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); 215 211 outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> ((*iter), point) ) ); … … 246 242 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 247 243 if ((*MolWalker)->ActiveFlag) { 248 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());249 double * FullInverseMatrix = InverseMatrix(FullMatrix);244 Matrix FullMatrix = World::getInstance().getDomain().getM(); 245 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 250 246 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 251 247 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 253 249 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 254 250 if ((*type == NULL) || ((*iter)->type == *type)) { 255 periodicX = *(*iter)->node; 256 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 251 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 257 252 // go through every range in xyz and get distance 258 253 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 259 254 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 260 255 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 261 checkX = Vector(n[0], n[1], n[2]) + periodicX; 262 checkX.MatrixMultiplication(FullMatrix); 256 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 263 257 distance = checkX.distance(*point); 264 258 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); … … 267 261 } 268 262 } 269 delete[](FullMatrix);270 delete[](FullInverseMatrix);271 263 } 272 264 … … 352 344 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 353 345 if ((*MolWalker)->ActiveFlag) { 354 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());355 double * FullInverseMatrix = InverseMatrix(FullMatrix);346 Matrix FullMatrix = World::getInstance().getDomain().getM(); 347 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 356 348 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 357 349 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 359 351 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 360 352 if ((*type == NULL) || ((*iter)->type == *type)) { 361 periodicX = *(*iter)->node; 362 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 353 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 363 354 // go through every range in xyz and get distance 364 355 ShortestDistance = -1.; … … 366 357 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 367 358 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 368 checkX = Vector(n[0], n[1], n[2]) + periodicX; 369 checkX.MatrixMultiplication(FullMatrix); 359 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 370 360 TriangleIntersectionList Intersections(&checkX,Surface,LC); 371 361 distance = Intersections.GetSmallestDistance(); … … 381 371 } 382 372 } 383 delete[](FullMatrix);384 delete[](FullInverseMatrix);385 373 } 386 374 -
src/atom.cpp
r0d5dce r8f822c 112 112 * \return true - is inside, false - is not 113 113 */ 114 bool atom::IsInParallelepiped(const Vector offset, const double *parallelepiped) const114 bool atom::IsInParallelepiped(const Vector offset, const Matrix& parallelepiped) const 115 115 { 116 116 return (node->IsInParallelepiped(offset, parallelepiped)); … … 159 159 * \return true - \a *out present, false - \a *out is NULL 160 160 */ 161 bool atom::OutputArrayIndexed(o fstream * const out, const int *ElementNo, int *AtomNo, const char *comment) const161 bool atom::OutputArrayIndexed(ostream * const out, const int *ElementNo, int *AtomNo, const char *comment) const 162 162 { 163 163 AtomNo[type->Z]++; // increment number … … 236 236 * \param *AtomNo pointer to atom counter that is increased by one 237 237 */ 238 void atom::OutputMPQCLine(o fstream * const out, const Vector *center, int *AtomNo = NULL) const238 void atom::OutputMPQCLine(ostream * const out, const Vector *center, int *AtomNo = NULL) const 239 239 { 240 240 *out << "\t\t" << type->symbol << " [ " << x[0]-center->at(0) << "\t" << x[1]-center->at(1) << "\t" << x[2]-center->at(2) << " ]" << endl; -
src/atom.hpp
r0d5dce r8f822c 51 51 52 52 bool OutputIndexed(ofstream * const out, const int ElementNo, const int AtomNo, const char *comment = NULL) const; 53 bool OutputArrayIndexed(o fstream * const out, const int *ElementNo, int *AtomNo, const char *comment = NULL) const;53 bool OutputArrayIndexed(ostream * const out, const int *ElementNo, int *AtomNo, const char *comment = NULL) const; 54 54 bool OutputXYZLine(ofstream *out) const; 55 55 bool OutputTrajectory(ofstream * const out, const int *ElementNo, int *AtomNo, const int step) const; 56 56 bool OutputTrajectoryXYZ(ofstream * const out, const int step) const; 57 void OutputMPQCLine(o fstream * const out, const Vector *center, int *AtomNo) const;57 void OutputMPQCLine(ostream * const out, const Vector *center, int *AtomNo) const; 58 58 59 59 void InitComponentNr(); … … 66 66 double DistanceToVector(const Vector &origin) const; 67 67 double DistanceSquaredToVector(const Vector &origin) const; 68 bool IsInParallelepiped(const Vector offset, const double *parallelepiped) const;68 bool IsInParallelepiped(const Vector offset, const Matrix ¶llelepiped) const; 69 69 70 70 // getter and setter -
src/atom_trajectoryparticle.cpp
r0d5dce r8f822c 15 15 #include "log.hpp" 16 16 #include "parser.hpp" 17 #include "ThermoStatContainer.hpp" 17 18 #include "verbose.hpp" 18 19 … … 197 198 void TrajectoryParticle::Thermostat_Langevin(int Step, gsl_rng * r, double *ekin, config *configuration) 198 199 { 199 double sigma = sqrt(configuration->T argetTemp/type->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime)200 double sigma = sqrt(configuration->Thermostats->TargetTemp/type->mass); // sigma = (k_b T)/m (Hartree/atomicmass = atomiclength/atomictime) 200 201 Vector &U = Trajectory.U.at(Step); 201 202 if (FixedIon == 0) { // even FixedIon moves, only not by other's forces 202 203 // throw a dice to determine whether it gets hit by a heat bath particle 203 if (((((rand()/(double)RAND_MAX))*configuration->T empFrequency) < 1.)) {204 if (((((rand()/(double)RAND_MAX))*configuration->Thermostats->TempFrequency) < 1.)) { 204 205 DoLog(3) && (Log() << Verbose(3) << "Particle " << *this << " was hit (sigma " << sigma << "): " << sqrt(U[0]*U[0]+U[1]*U[1]+U[2]*U[2]) << " -> "); 205 206 // pick three random numbers from a Boltzmann distribution around the desired temperature T for each momenta axis … … 225 226 if (FixedIon == 0) { // even FixedIon moves, only not by other's forces 226 227 for (int d=0; d<NDIM; d++) { 227 U[d] *= sqrt(1+(configuration->Deltat/configuration->T empFrequency)*(ScaleTempFactor-1));228 U[d] *= sqrt(1+(configuration->Deltat/configuration->Thermostats->TempFrequency)*(ScaleTempFactor-1)); 228 229 *ekin += 0.5*type->mass * U[d]*U[d]; 229 230 } … … 255 256 if (FixedIon == 0) { // even FixedIon moves, only not by other's forces 256 257 for (int d=0; d<NDIM; d++) { 257 U[d] += configuration->Deltat/type->mass * (configuration-> alpha * (U[d] * type->mass));258 U[d] += configuration->Deltat/type->mass * (configuration->Thermostats->alpha * (U[d] * type->mass)); 258 259 *ekin += (0.5*type->mass) * U[d]*U[d]; 259 260 } -
src/boundary.cpp
r0d5dce r8f822c 22 22 #include "World.hpp" 23 23 #include "Plane.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 24 26 25 27 #include<gsl/gsl_poly.h> … … 764 766 int N[NDIM]; 765 767 int n[NDIM]; 766 double *M = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());767 double Rotations[NDIM*NDIM];768 double *MInverse = InverseMatrix(M);768 const Matrix &M = World::getInstance().getDomain().getM(); 769 Matrix Rotations; 770 const Matrix &MInverse = World::getInstance().getDomain().getMinv(); 769 771 Vector AtomTranslations; 770 772 Vector FillerTranslations; … … 799 801 800 802 // calculate filler grid in [0,1]^3 801 FillerDistance = Vector(distance[0], distance[1], distance[2]); 802 FillerDistance.InverseMatrixMultiplication(M); 803 FillerDistance = MInverse * Vector(distance[0], distance[1], distance[2]); 803 804 for(int i=0;i<NDIM;i++) 804 805 N[i] = (int) ceil(1./FillerDistance[i]); … … 813 814 for (n[2] = 0; n[2] < N[2]; n[2]++) { 814 815 // calculate position of current grid vector in untransformed box 815 CurrentPosition = Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]); 816 CurrentPosition.MatrixMultiplication(M); 816 CurrentPosition = M * Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]); 817 817 // create molecule random translation vector ... 818 818 for (int i=0;i<NDIM;i++) … … 835 835 } 836 836 837 Rotations [0] = cos(phi[0]) *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2]));838 Rotations [3] = sin(phi[0]) *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2]));839 Rotations [6] = cos(phi[1])*sin(phi[2]);840 Rotations [1] = - sin(phi[0])*cos(phi[1]);841 Rotations [4] = cos(phi[0])*cos(phi[1]);842 Rotations [7] = sin(phi[1]);843 Rotations [3] = - cos(phi[0]) *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2]));844 Rotations [5] = - sin(phi[0]) *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2]));845 Rotations [8] = cos(phi[1])*cos(phi[2]);837 Rotations.set(0,0, cos(phi[0]) *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2]))); 838 Rotations.set(0,1, sin(phi[0]) *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2]))); 839 Rotations.set(0,2, cos(phi[1])*sin(phi[2]) ); 840 Rotations.set(1,0, -sin(phi[0])*cos(phi[1]) ); 841 Rotations.set(1,1, cos(phi[0])*cos(phi[1]) ); 842 Rotations.set(1,2, sin(phi[1]) ); 843 Rotations.set(2,0, -cos(phi[0]) *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2]))); 844 Rotations.set(2,1, -sin(phi[0]) *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2]))); 845 Rotations.set(2,2, cos(phi[1])*cos(phi[2]) ); 846 846 } 847 847 … … 849 849 Inserter = (*iter)->x; 850 850 if (DoRandomRotation) 851 Inserter .MatrixMultiplication(Rotations);851 Inserter *= Rotations; 852 852 Inserter += AtomTranslations + FillerTranslations + CurrentPosition; 853 853 854 854 // check whether inserter is inside box 855 Inserter .MatrixMultiplication(MInverse);855 Inserter *= MInverse; 856 856 FillIt = true; 857 857 for (int i=0;i<NDIM;i++) 858 858 FillIt = FillIt && (Inserter[i] >= -MYEPSILON) && ((Inserter[i]-1.) <= MYEPSILON); 859 Inserter .MatrixMultiplication(M);859 Inserter *= M; 860 860 861 861 // Check whether point is in- or outside … … 892 892 } 893 893 } 894 delete[](M);895 delete[](MInverse);896 894 897 895 return Filling; -
src/builder.cpp
r0d5dce r8f822c 1 1 /** \file builder.cpp 2 2 * 3 * By stating absolute positions or binding angles and distances atomic positions of a molecule can be constructed. 4 * The output is the complete configuration file for PCP for direct use. 5 * Features: 6 * -# Atomic data is retrieved from a file, if not found requested and stored there for later re-use 7 * -# step-by-step construction of the molecule beginning either at a centre of with a certain atom 3 * date: Jan 1, 2007 4 * author: heber 8 5 * 9 6 */ 10 7 11 /*! \mainpage Mole cuilder - a molecular set builder8 /*! \mainpage MoleCuilder - a molecular set builder 12 9 * 13 * This introductory shall briefly make a quainted with the program, helping in installing and a first run.10 * This introductory shall briefly make acquainted with the program, helping in installing and a first run. 14 11 * 15 12 * \section about About the Program 16 13 * 17 * Molecuilder is a short program, written in C++, that enables the construction of a coordinate set for the 18 * atoms making up an molecule by the successive statement of binding angles and distances and referencing to 19 * already constructed atoms. 14 * MoleCuilder is a program, written entirely in C++, that enables the construction of a coordinate set for the 15 * atoms making up an molecule. It allows for both building of simple molecules by adding atom-wise giving bond 16 * angles and distances or absolute coordinates, but also using them as templates. Regions can be specified and 17 * ordered to be filled with a molecule in a certain manner. Greater conglomerations of molecules can be tesselated 18 * and recognized as a region themselves to be subsequently surrounded by other (surface solvated) molecules. 19 * In the end, MoleCuilder allows the construction of arbitrary nano structures, whether they be crystalline or 20 * amorphic in nature. 20 21 * 21 * A configuration file may be written that is compatible to the format used by PCP - a parallel Car-Parrinello22 * molecular dynamics implementation.23 22 * 24 23 * \section install Installation … … 32 31 * -# make clean uninstall: deletes .o-files and removes executable from the given binary directory\n 33 32 * -# make doxygen-doc: Creates these html pages out of the documented source 33 * -# make check: Runs an extensive set of unit tests and a testsuite which also gives a good overview on the set of 34 * functions. 34 35 * 35 36 * \section run Running … … 37 38 * The program can be executed by running: ./molecuilder 38 39 * 39 * Note, that it uses a database, called "elements.db", in the executable's directory. If the file is not found, 40 * it is created and any given data on elements of the periodic table will be stored therein and re-used on 41 * later re-execution. 40 * MoleCuilder has three interfaces at your disposal: 41 * -# Textmenu: A simple interactive console-based menu, where awaits your choices and inputs in order to set atoms 42 * as you like 43 * -# CommandLineUI: Every command can also be chained up as a sequence of actions on the command line to be executed 44 * with any user interaction. 45 * -# GraphicalUI: A graphical user interface that also display the molecular structure being built and lots of other 46 * informations to ease the construction of bigger geometries. 42 47 * 43 * \section ref References 44 * 45 * For the special configuration file format, see the documentation of pcp. 48 * The supported output formats right now are: 49 * -# mpqc: Configuration files of the Massively Parallel Quantum Chemistry package (Sandia labs) 50 * -# pcp: Configuration files of the Parallel Car-Parrinello program (Institute for Numerical Simulation) 51 * -# tremolo: Configuration files of TREMOLO (Institute for Numerical Simulation) 52 * -# xyz: the most basic format for the 3d arrangement of atoms consisting of a list of element and 3 coordinates. 46 53 * 47 54 */ … … 49 56 #include "Helpers/MemDebug.hpp" 50 57 51 #include <boost/bind.hpp>52 53 using namespace std;54 55 #include <cstring>56 #include <cstdlib>57 58 #include "analysis_bonds.hpp"59 #include "analysis_correlation.hpp"60 #include "atom.hpp"61 #include "bond.hpp"62 58 #include "bondgraph.hpp" 63 #include "boundary.hpp"64 59 #include "CommandLineParser.hpp" 65 60 #include "config.hpp" 66 #include "element.hpp"67 #include "ellipsoid.hpp"68 #include "helpers.hpp"69 #include "leastsquaremin.hpp"70 #include "linkedcell.hpp"71 61 #include "log.hpp" 72 #include "memoryusageobserver.hpp" 73 #include "molecule.hpp" 74 #include "periodentafel.hpp" 62 #include "verbose.hpp" 63 #include "World.hpp" 64 65 #include "Actions/ActionRegistry.hpp" 66 #include "Actions/ActionHistory.hpp" 67 #include "Actions/MapOfActions.hpp" 68 69 #include "Parser/ChangeTracker.hpp" 70 #include "Parser/FormatParserStorage.hpp" 71 75 72 #include "UIElements/UIFactory.hpp" 76 73 #include "UIElements/TextUI/TextUIFactory.hpp" … … 78 75 #include "UIElements/MainWindow.hpp" 79 76 #include "UIElements/Dialog.hpp" 80 #include "Menu/ActionMenuItem.hpp" 81 #include "Actions/ActionRegistry.hpp" 82 #include "Actions/ActionHistory.hpp" 83 #include "Actions/MapOfActions.hpp" 84 #include "Actions/MethodAction.hpp" 85 #include "Actions/MoleculeAction/ChangeNameAction.hpp" 86 #include "World.hpp" 77 87 78 #include "version.h" 88 #include "World.hpp"89 79 90 91 /********************************************* Subsubmenu routine ************************************/92 #if 093 /** Submenu for adding atoms to the molecule.94 * \param *periode periodentafel95 * \param *molecule molecules with atoms96 */97 static void AddAtoms(periodentafel *periode, molecule *mol)98 {99 atom *first, *second, *third, *fourth;100 Vector **atoms;101 Vector x,y,z,n; // coordinates for absolute point in cell volume102 double a,b,c;103 char choice; // menu choice char104 bool valid;105 106 cout << Verbose(0) << "===========ADD ATOM============================" << endl;107 cout << Verbose(0) << " a - state absolute coordinates of atom" << endl;108 cout << Verbose(0) << " b - state relative coordinates of atom wrt to reference point" << endl;109 cout << Verbose(0) << " c - state relative coordinates of atom wrt to already placed atom" << endl;110 cout << Verbose(0) << " d - state two atoms, two angles and a distance" << endl;111 cout << Verbose(0) << " e - least square distance position to a set of atoms" << endl;112 cout << Verbose(0) << "all else - go back" << endl;113 cout << Verbose(0) << "===============================================" << endl;114 cout << Verbose(0) << "Note: Specifiy angles in degrees not multiples of Pi!" << endl;115 cout << Verbose(0) << "INPUT: ";116 cin >> choice;117 118 switch (choice) {119 default:120 DoeLog(2) && (eLog()<< Verbose(2) << "Not a valid choice." << endl);121 break;122 case 'a': // absolute coordinates of atom123 cout << Verbose(0) << "Enter absolute coordinates." << endl;124 first = new atom;125 first->x.AskPosition(World::getInstance().getDomain(), false);126 first->type = periode->AskElement(); // give type127 mol->AddAtom(first); // add to molecule128 break;129 130 case 'b': // relative coordinates of atom wrt to reference point131 first = new atom;132 valid = true;133 do {134 if (!valid) DoeLog(2) && (eLog()<< Verbose(2) << "Resulting position out of cell." << endl);135 cout << Verbose(0) << "Enter reference coordinates." << endl;136 x.AskPosition(World::getInstance().getDomain(), true);137 cout << Verbose(0) << "Enter relative coordinates." << endl;138 first->x.AskPosition(World::getInstance().getDomain(), false);139 first->x.AddVector((const Vector *)&x);140 cout << Verbose(0) << "\n";141 } while (!(valid = mol->CheckBounds((const Vector *)&first->x)));142 first->type = periode->AskElement(); // give type143 mol->AddAtom(first); // add to molecule144 break;145 146 case 'c': // relative coordinates of atom wrt to already placed atom147 first = new atom;148 valid = true;149 do {150 if (!valid) DoeLog(2) && (eLog()<< Verbose(2) << "Resulting position out of cell." << endl);151 second = mol->AskAtom("Enter atom number: ");152 DoLog(0) && (Log() << Verbose(0) << "Enter relative coordinates." << endl);153 first->x.AskPosition(World::getInstance().getDomain(), false);154 for (int i=NDIM;i--;) {155 first->x.x[i] += second->x.x[i];156 }157 } while (!(valid = mol->CheckBounds((const Vector *)&first->x)));158 first->type = periode->AskElement(); // give type159 mol->AddAtom(first); // add to molecule160 break;161 162 case 'd': // two atoms, two angles and a distance163 first = new atom;164 valid = true;165 do {166 if (!valid) {167 DoeLog(2) && (eLog()<< Verbose(2) << "Resulting coordinates out of cell - " << first->x << endl);168 }169 cout << Verbose(0) << "First, we need two atoms, the first atom is the central, while the second is the outer one." << endl;170 second = mol->AskAtom("Enter central atom: ");171 third = mol->AskAtom("Enter second atom (specifying the axis for first angle): ");172 fourth = mol->AskAtom("Enter third atom (specifying a plane for second angle): ");173 a = ask_value("Enter distance between central (first) and new atom: ");174 b = ask_value("Enter angle between new, first and second atom (degrees): ");175 b *= M_PI/180.;176 bound(&b, 0., 2.*M_PI);177 c = ask_value("Enter second angle between new and normal vector of plane defined by first, second and third atom (degrees): ");178 c *= M_PI/180.;179 bound(&c, -M_PI, M_PI);180 cout << Verbose(0) << "radius: " << a << "\t phi: " << b*180./M_PI << "\t theta: " << c*180./M_PI << endl;181 /*182 second->Output(1,1,(ofstream *)&cout);183 third->Output(1,2,(ofstream *)&cout);184 fourth->Output(1,3,(ofstream *)&cout);185 n.MakeNormalvector((const vector *)&second->x, (const vector *)&third->x, (const vector *)&fourth->x);186 x.Copyvector(&second->x);187 x.SubtractVector(&third->x);188 x.Copyvector(&fourth->x);189 x.SubtractVector(&third->x);190 191 if (!z.SolveSystem(&x,&y,&n, b, c, a)) {192 coutg() << Verbose(0) << "Failure solving self-dependent linear system!" << endl;193 continue;194 }195 DoLog(0) && (Log() << Verbose(0) << "resulting relative coordinates: ");196 z.Output();197 DoLog(0) && (Log() << Verbose(0) << endl);198 */199 // calc axis vector200 x.CopyVector(&second->x);201 x.SubtractVector(&third->x);202 x.Normalize();203 Log() << Verbose(0) << "x: ",204 x.Output();205 DoLog(0) && (Log() << Verbose(0) << endl);206 z.MakeNormalVector(&second->x,&third->x,&fourth->x);207 Log() << Verbose(0) << "z: ",208 z.Output();209 DoLog(0) && (Log() << Verbose(0) << endl);210 y.MakeNormalVector(&x,&z);211 Log() << Verbose(0) << "y: ",212 y.Output();213 DoLog(0) && (Log() << Verbose(0) << endl);214 215 // rotate vector around first angle216 first->x.CopyVector(&x);217 first->x.RotateVector(&z,b - M_PI);218 Log() << Verbose(0) << "Rotated vector: ",219 first->x.Output();220 DoLog(0) && (Log() << Verbose(0) << endl);221 // remove the projection onto the rotation plane of the second angle222 n.CopyVector(&y);223 n.Scale(first->x.ScalarProduct(&y));224 Log() << Verbose(0) << "N1: ",225 n.Output();226 DoLog(0) && (Log() << Verbose(0) << endl);227 first->x.SubtractVector(&n);228 Log() << Verbose(0) << "Subtracted vector: ",229 first->x.Output();230 DoLog(0) && (Log() << Verbose(0) << endl);231 n.CopyVector(&z);232 n.Scale(first->x.ScalarProduct(&z));233 Log() << Verbose(0) << "N2: ",234 n.Output();235 DoLog(0) && (Log() << Verbose(0) << endl);236 first->x.SubtractVector(&n);237 Log() << Verbose(0) << "2nd subtracted vector: ",238 first->x.Output();239 DoLog(0) && (Log() << Verbose(0) << endl);240 241 // rotate another vector around second angle242 n.CopyVector(&y);243 n.RotateVector(&x,c - M_PI);244 Log() << Verbose(0) << "2nd Rotated vector: ",245 n.Output();246 DoLog(0) && (Log() << Verbose(0) << endl);247 248 // add the two linear independent vectors249 first->x.AddVector(&n);250 first->x.Normalize();251 first->x.Scale(a);252 first->x.AddVector(&second->x);253 254 DoLog(0) && (Log() << Verbose(0) << "resulting coordinates: ");255 first->x.Output();256 DoLog(0) && (Log() << Verbose(0) << endl);257 } while (!(valid = mol->CheckBounds((const Vector *)&first->x)));258 first->type = periode->AskElement(); // give type259 mol->AddAtom(first); // add to molecule260 break;261 262 case 'e': // least square distance position to a set of atoms263 first = new atom;264 atoms = new (Vector*[128]);265 valid = true;266 for(int i=128;i--;)267 atoms[i] = NULL;268 int i=0, j=0;269 cout << Verbose(0) << "Now we need at least three molecules.\n";270 do {271 cout << Verbose(0) << "Enter " << i+1 << "th atom: ";272 cin >> j;273 if (j != -1) {274 second = mol->FindAtom(j);275 atoms[i++] = &(second->x);276 }277 } while ((j != -1) && (i<128));278 if (i >= 2) {279 first->x.LSQdistance((const Vector **)atoms, i);280 first->x.Output();281 first->type = periode->AskElement(); // give type282 mol->AddAtom(first); // add to molecule283 } else {284 delete first;285 cout << Verbose(0) << "Please enter at least two vectors!\n";286 }287 break;288 };289 };290 291 /** Submenu for centering the atoms in the molecule.292 * \param *mol molecule with all the atoms293 */294 static void CenterAtoms(molecule *mol)295 {296 Vector x, y, helper;297 char choice; // menu choice char298 299 cout << Verbose(0) << "===========CENTER ATOMS=========================" << endl;300 cout << Verbose(0) << " a - on origin" << endl;301 cout << Verbose(0) << " b - on center of gravity" << endl;302 cout << Verbose(0) << " c - within box with additional boundary" << endl;303 cout << Verbose(0) << " d - within given simulation box" << endl;304 cout << Verbose(0) << "all else - go back" << endl;305 cout << Verbose(0) << "===============================================" << endl;306 cout << Verbose(0) << "INPUT: ";307 cin >> choice;308 309 switch (choice) {310 default:311 cout << Verbose(0) << "Not a valid choice." << endl;312 break;313 case 'a':314 cout << Verbose(0) << "Centering atoms in config file on origin." << endl;315 mol->CenterOrigin();316 break;317 case 'b':318 cout << Verbose(0) << "Centering atoms in config file on center of gravity." << endl;319 mol->CenterPeriodic();320 break;321 case 'c':322 cout << Verbose(0) << "Centering atoms in config file within given additional boundary." << endl;323 for (int i=0;i<NDIM;i++) {324 cout << Verbose(0) << "Enter axis " << i << " boundary: ";325 cin >> y.x[i];326 }327 mol->CenterEdge(&x); // make every coordinate positive328 mol->Center.AddVector(&y); // translate by boundary329 helper.CopyVector(&y);330 helper.Scale(2.);331 helper.AddVector(&x);332 mol->SetBoxDimension(&helper); // update Box of atoms by boundary333 break;334 case 'd':335 cout << Verbose(1) << "Centering atoms in config file within given simulation box." << endl;336 for (int i=0;i<NDIM;i++) {337 cout << Verbose(0) << "Enter axis " << i << " boundary: ";338 cin >> x.x[i];339 }340 // update Box of atoms by boundary341 mol->SetBoxDimension(&x);342 // center343 mol->CenterInBox();344 break;345 }346 };347 348 /** Submenu for aligning the atoms in the molecule.349 * \param *periode periodentafel350 * \param *mol molecule with all the atoms351 */352 static void AlignAtoms(periodentafel *periode, molecule *mol)353 {354 atom *first, *second, *third;355 Vector x,n;356 char choice; // menu choice char357 358 cout << Verbose(0) << "===========ALIGN ATOMS=========================" << endl;359 cout << Verbose(0) << " a - state three atoms defining align plane" << endl;360 cout << Verbose(0) << " b - state alignment vector" << endl;361 cout << Verbose(0) << " c - state two atoms in alignment direction" << endl;362 cout << Verbose(0) << " d - align automatically by least square fit" << endl;363 cout << Verbose(0) << "all else - go back" << endl;364 cout << Verbose(0) << "===============================================" << endl;365 cout << Verbose(0) << "INPUT: ";366 cin >> choice;367 368 switch (choice) {369 default:370 case 'a': // three atoms defining mirror plane371 first = mol->AskAtom("Enter first atom: ");372 second = mol->AskAtom("Enter second atom: ");373 third = mol->AskAtom("Enter third atom: ");374 375 n.MakeNormalVector((const Vector *)&first->x,(const Vector *)&second->x,(const Vector *)&third->x);376 break;377 case 'b': // normal vector of mirror plane378 cout << Verbose(0) << "Enter normal vector of mirror plane." << endl;379 n.AskPosition(World::getInstance().getDomain(),0);380 n.Normalize();381 break;382 case 'c': // three atoms defining mirror plane383 first = mol->AskAtom("Enter first atom: ");384 second = mol->AskAtom("Enter second atom: ");385 386 n.CopyVector((const Vector *)&first->x);387 n.SubtractVector((const Vector *)&second->x);388 n.Normalize();389 break;390 case 'd':391 char shorthand[4];392 Vector a;393 struct lsq_params param;394 do {395 fprintf(stdout, "Enter the element of atoms to be chosen: ");396 fscanf(stdin, "%3s", shorthand);397 } while ((param.type = periode->FindElement(shorthand)) == NULL);398 cout << Verbose(0) << "Element is " << param.type->name << endl;399 mol->GetAlignvector(¶m);400 for (int i=NDIM;i--;) {401 x.x[i] = gsl_vector_get(param.x,i);402 n.x[i] = gsl_vector_get(param.x,i+NDIM);403 }404 gsl_vector_free(param.x);405 cout << Verbose(0) << "Offset vector: ";406 x.Output();407 DoLog(0) && (Log() << Verbose(0) << endl);408 n.Normalize();409 break;410 };411 DoLog(0) && (Log() << Verbose(0) << "Alignment vector: ");412 n.Output();413 DoLog(0) && (Log() << Verbose(0) << endl);414 mol->Align(&n);415 };416 417 /** Submenu for mirroring the atoms in the molecule.418 * \param *mol molecule with all the atoms419 */420 static void MirrorAtoms(molecule *mol)421 {422 atom *first, *second, *third;423 Vector n;424 char choice; // menu choice char425 426 DoLog(0) && (Log() << Verbose(0) << "===========MIRROR ATOMS=========================" << endl);427 DoLog(0) && (Log() << Verbose(0) << " a - state three atoms defining mirror plane" << endl);428 DoLog(0) && (Log() << Verbose(0) << " b - state normal vector of mirror plane" << endl);429 DoLog(0) && (Log() << Verbose(0) << " c - state two atoms in normal direction" << endl);430 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);431 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);432 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");433 cin >> choice;434 435 switch (choice) {436 default:437 case 'a': // three atoms defining mirror plane438 first = mol->AskAtom("Enter first atom: ");439 second = mol->AskAtom("Enter second atom: ");440 third = mol->AskAtom("Enter third atom: ");441 442 n.MakeNormalVector((const Vector *)&first->x,(const Vector *)&second->x,(const Vector *)&third->x);443 break;444 case 'b': // normal vector of mirror plane445 DoLog(0) && (Log() << Verbose(0) << "Enter normal vector of mirror plane." << endl);446 n.AskPosition(World::getInstance().getDomain(),0);447 n.Normalize();448 break;449 case 'c': // three atoms defining mirror plane450 first = mol->AskAtom("Enter first atom: ");451 second = mol->AskAtom("Enter second atom: ");452 453 n.CopyVector((const Vector *)&first->x);454 n.SubtractVector((const Vector *)&second->x);455 n.Normalize();456 break;457 };458 DoLog(0) && (Log() << Verbose(0) << "Normal vector: ");459 n.Output();460 DoLog(0) && (Log() << Verbose(0) << endl);461 mol->Mirror((const Vector *)&n);462 };463 464 /** Submenu for removing the atoms from the molecule.465 * \param *mol molecule with all the atoms466 */467 static void RemoveAtoms(molecule *mol)468 {469 atom *first, *second;470 int axis;471 double tmp1, tmp2;472 char choice; // menu choice char473 474 DoLog(0) && (Log() << Verbose(0) << "===========REMOVE ATOMS=========================" << endl);475 DoLog(0) && (Log() << Verbose(0) << " a - state atom for removal by number" << endl);476 DoLog(0) && (Log() << Verbose(0) << " b - keep only in radius around atom" << endl);477 DoLog(0) && (Log() << Verbose(0) << " c - remove this with one axis greater value" << endl);478 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);479 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);480 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");481 cin >> choice;482 483 switch (choice) {484 default:485 case 'a':486 if (mol->RemoveAtom(mol->AskAtom("Enter number of atom within molecule: ")))487 DoLog(1) && (Log() << Verbose(1) << "Atom removed." << endl);488 else489 DoLog(1) && (Log() << Verbose(1) << "Atom not found." << endl);490 break;491 case 'b':492 second = mol->AskAtom("Enter number of atom as reference point: ");493 DoLog(0) && (Log() << Verbose(0) << "Enter radius: ");494 cin >> tmp1;495 first = mol->start;496 second = first->next;497 while(second != mol->end) {498 first = second;499 second = first->next;500 if (first->x.DistanceSquared((const Vector *)&second->x) > tmp1*tmp1) // distance to first above radius ...501 mol->RemoveAtom(first);502 }503 break;504 case 'c':505 DoLog(0) && (Log() << Verbose(0) << "Which axis is it: ");506 cin >> axis;507 DoLog(0) && (Log() << Verbose(0) << "Lower boundary: ");508 cin >> tmp1;509 DoLog(0) && (Log() << Verbose(0) << "Upper boundary: ");510 cin >> tmp2;511 first = mol->start;512 second = first->next;513 while(second != mol->end) {514 first = second;515 second = first->next;516 if ((first->x.x[axis] < tmp1) || (first->x.x[axis] > tmp2)) {// out of boundary ...517 //Log() << Verbose(0) << "Atom " << *first << " with " << first->x.x[axis] << " on axis " << axis << " is out of bounds [" << tmp1 << "," << tmp2 << "]." << endl;518 mol->RemoveAtom(first);519 }520 }521 break;522 };523 //mol->Output();524 choice = 'r';525 };526 527 /** Submenu for measuring out the atoms in the molecule.528 * \param *periode periodentafel529 * \param *mol molecule with all the atoms530 */531 static void MeasureAtoms(periodentafel *periode, molecule *mol, config *configuration)532 {533 atom *first, *second, *third;534 Vector x,y;535 double min[256], tmp1, tmp2, tmp3;536 int Z;537 char choice; // menu choice char538 539 DoLog(0) && (Log() << Verbose(0) << "===========MEASURE ATOMS=========================" << endl);540 DoLog(0) && (Log() << Verbose(0) << " a - calculate bond length between one atom and all others" << endl);541 DoLog(0) && (Log() << Verbose(0) << " b - calculate bond length between two atoms" << endl);542 DoLog(0) && (Log() << Verbose(0) << " c - calculate bond angle" << endl);543 DoLog(0) && (Log() << Verbose(0) << " d - calculate principal axis of the system" << endl);544 DoLog(0) && (Log() << Verbose(0) << " e - calculate volume of the convex envelope" << endl);545 DoLog(0) && (Log() << Verbose(0) << " f - calculate temperature from current velocity" << endl);546 DoLog(0) && (Log() << Verbose(0) << " g - output all temperatures per step from velocities" << endl);547 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);548 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);549 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");550 cin >> choice;551 552 switch(choice) {553 default:554 DoLog(1) && (Log() << Verbose(1) << "Not a valid choice." << endl);555 break;556 case 'a':557 first = mol->AskAtom("Enter first atom: ");558 for (int i=MAX_ELEMENTS;i--;)559 min[i] = 0.;560 561 second = mol->start;562 while ((second->next != mol->end)) {563 second = second->next; // advance564 Z = second->type->Z;565 tmp1 = 0.;566 if (first != second) {567 x.CopyVector((const Vector *)&first->x);568 x.SubtractVector((const Vector *)&second->x);569 tmp1 = x.Norm();570 }571 if ((tmp1 != 0.) && ((min[Z] == 0.) || (tmp1 < min[Z]))) min[Z] = tmp1;572 //Log() << Verbose(0) << "Bond length between Atom " << first->nr << " and " << second->nr << ": " << tmp1 << " a.u." << endl;573 }574 for (int i=MAX_ELEMENTS;i--;)575 if (min[i] != 0.) Log() << Verbose(0) << "Minimum Bond length between " << first->type->name << " Atom " << first->nr << " and next Ion of type " << (periode->FindElement(i))->name << ": " << min[i] << " a.u." << endl;576 break;577 578 case 'b':579 first = mol->AskAtom("Enter first atom: ");580 second = mol->AskAtom("Enter second atom: ");581 for (int i=NDIM;i--;)582 min[i] = 0.;583 x.CopyVector((const Vector *)&first->x);584 x.SubtractVector((const Vector *)&second->x);585 tmp1 = x.Norm();586 DoLog(1) && (Log() << Verbose(1) << "Distance vector is ");587 x.Output();588 DoLog(0) && (Log() << Verbose(0) << "." << endl << "Norm of distance is " << tmp1 << "." << endl);589 break;590 591 case 'c':592 DoLog(0) && (Log() << Verbose(0) << "Evaluating bond angle between three - first, central, last - atoms." << endl);593 first = mol->AskAtom("Enter first atom: ");594 second = mol->AskAtom("Enter central atom: ");595 third = mol->AskAtom("Enter last atom: ");596 tmp1 = tmp2 = tmp3 = 0.;597 x.CopyVector((const Vector *)&first->x);598 x.SubtractVector((const Vector *)&second->x);599 y.CopyVector((const Vector *)&third->x);600 y.SubtractVector((const Vector *)&second->x);601 DoLog(0) && (Log() << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": ");602 DoLog(0) && (Log() << Verbose(0) << (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.) << " degrees" << endl);603 break;604 case 'd':605 DoLog(0) && (Log() << Verbose(0) << "Evaluating prinicipal axis." << endl);606 DoLog(0) && (Log() << Verbose(0) << "Shall we rotate? [0/1]: ");607 cin >> Z;608 if ((Z >=0) && (Z <=1))609 mol->PrincipalAxisSystem((bool)Z);610 else611 mol->PrincipalAxisSystem(false);612 break;613 case 'e':614 {615 DoLog(0) && (Log() << Verbose(0) << "Evaluating volume of the convex envelope.");616 class Tesselation *TesselStruct = NULL;617 const LinkedCell *LCList = NULL;618 LCList = new LinkedCell(mol, 10.);619 FindConvexBorder(mol, TesselStruct, LCList, NULL);620 double clustervolume = VolumeOfConvexEnvelope(TesselStruct, configuration);621 DoLog(0) && (Log() << Verbose(0) << "The tesselated surface area is " << clustervolume << "." << endl);\622 delete(LCList);623 delete(TesselStruct);624 }625 break;626 case 'f':627 mol->OutputTemperatureFromTrajectories((ofstream *)&cout, mol->MDSteps-1, mol->MDSteps);628 break;629 case 'g':630 {631 char filename[255];632 DoLog(0) && (Log() << Verbose(0) << "Please enter filename: " << endl);633 cin >> filename;634 DoLog(1) && (Log() << Verbose(1) << "Storing temperatures in " << filename << "." << endl);635 ofstream *output = new ofstream(filename, ios::trunc);636 if (!mol->OutputTemperatureFromTrajectories(output, 0, mol->MDSteps))637 DoLog(2) && (Log() << Verbose(2) << "File could not be written." << endl);638 else639 DoLog(2) && (Log() << Verbose(2) << "File stored." << endl);640 output->close();641 delete(output);642 }643 break;644 }645 };646 647 /** Submenu for measuring out the atoms in the molecule.648 * \param *mol molecule with all the atoms649 * \param *configuration configuration structure for the to be written config files of all fragments650 */651 static void FragmentAtoms(molecule *mol, config *configuration)652 {653 int Order1;654 clock_t start, end;655 656 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl);657 DoLog(0) && (Log() << Verbose(0) << "What's the desired bond order: ");658 cin >> Order1;659 if (mol->first->next != mol->last) { // there are bonds660 start = clock();661 mol->FragmentMolecule(Order1, configuration);662 end = clock();663 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl);664 } else665 DoLog(0) && (Log() << Verbose(0) << "Connection matrix has not yet been generated!" << endl);666 };667 668 /********************************************** Submenu routine **************************************/669 670 /** Submenu for manipulating atoms.671 * \param *periode periodentafel672 * \param *molecules list of molecules whose atoms are to be manipulated673 */674 static void ManipulateAtoms(periodentafel *periode, MoleculeListClass *molecules, config *configuration)675 {676 atom *first, *second, *third;677 molecule *mol = NULL;678 Vector x,y,z,n; // coordinates for absolute point in cell volume679 double *factor; // unit factor if desired680 double bond, minBond;681 char choice; // menu choice char682 bool valid;683 684 DoLog(0) && (Log() << Verbose(0) << "=========MANIPULATE ATOMS======================" << endl);685 DoLog(0) && (Log() << Verbose(0) << "a - add an atom" << endl);686 DoLog(0) && (Log() << Verbose(0) << "r - remove an atom" << endl);687 DoLog(0) && (Log() << Verbose(0) << "b - scale a bond between atoms" << endl);688 DoLog(0) && (Log() << Verbose(0) << "t - turn an atom round another bond" << endl);689 DoLog(0) && (Log() << Verbose(0) << "u - change an atoms element" << endl);690 DoLog(0) && (Log() << Verbose(0) << "l - measure lengths, angles, ... for an atom" << endl);691 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);692 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);693 if (molecules->NumberOfActiveMolecules() > 1)694 DoeLog(2) && (eLog()<< Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl);695 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");696 cin >> choice;697 698 switch (choice) {699 default:700 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl);701 break;702 703 case 'a': // add atom704 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)705 if ((*ListRunner)->ActiveFlag) {706 mol = *ListRunner;707 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);708 AddAtoms(periode, mol);709 }710 break;711 712 case 'b': // scale a bond713 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)714 if ((*ListRunner)->ActiveFlag) {715 mol = *ListRunner;716 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);717 DoLog(0) && (Log() << Verbose(0) << "Scaling bond length between two atoms." << endl);718 first = mol->AskAtom("Enter first (fixed) atom: ");719 second = mol->AskAtom("Enter second (shifting) atom: ");720 minBond = 0.;721 for (int i=NDIM;i--;)722 minBond += (first->x.x[i]-second->x.x[i])*(first->x.x[i] - second->x.x[i]);723 minBond = sqrt(minBond);724 DoLog(0) && (Log() << Verbose(0) << "Current Bond length between " << first->type->name << " Atom " << first->nr << " and " << second->type->name << " Atom " << second->nr << ": " << minBond << " a.u." << endl);725 DoLog(0) && (Log() << Verbose(0) << "Enter new bond length [a.u.]: ");726 cin >> bond;727 for (int i=NDIM;i--;) {728 second->x.x[i] -= (second->x.x[i]-first->x.x[i])/minBond*(minBond-bond);729 }730 //Log() << Verbose(0) << "New coordinates of Atom " << second->nr << " are: ";731 //second->Output(second->type->No, 1);732 }733 break;734 735 case 'c': // unit scaling of the metric736 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)737 if ((*ListRunner)->ActiveFlag) {738 mol = *ListRunner;739 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);740 DoLog(0) && (Log() << Verbose(0) << "Angstroem -> Bohrradius: 1.8897261\t\tBohrradius -> Angstroem: 0.52917721" << endl);741 DoLog(0) && (Log() << Verbose(0) << "Enter three factors: ");742 factor = new double[NDIM];743 cin >> factor[0];744 cin >> factor[1];745 cin >> factor[2];746 valid = true;747 mol->Scale((const double ** const)&factor);748 delete[](factor);749 }750 break;751 752 case 'l': // measure distances or angles753 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)754 if ((*ListRunner)->ActiveFlag) {755 mol = *ListRunner;756 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);757 MeasureAtoms(periode, mol, configuration);758 }759 break;760 761 case 'r': // remove atom762 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)763 if ((*ListRunner)->ActiveFlag) {764 mol = *ListRunner;765 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);766 RemoveAtoms(mol);767 }768 break;769 770 case 't': // turn/rotate atom771 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)772 if ((*ListRunner)->ActiveFlag) {773 mol = *ListRunner;774 DoLog(0) && (Log() << Verbose(0) << "Turning atom around another bond - first is atom to turn, second (central) and third specify bond" << endl);775 first = mol->AskAtom("Enter turning atom: ");776 second = mol->AskAtom("Enter central atom: ");777 third = mol->AskAtom("Enter bond atom: ");778 cout << Verbose(0) << "Enter new angle in degrees: ";779 double tmp = 0.;780 cin >> tmp;781 // calculate old angle782 x.CopyVector((const Vector *)&first->x);783 x.SubtractVector((const Vector *)&second->x);784 y.CopyVector((const Vector *)&third->x);785 y.SubtractVector((const Vector *)&second->x);786 double alpha = (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.);787 cout << Verbose(0) << "Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": ";788 cout << Verbose(0) << alpha << " degrees" << endl;789 // rotate790 z.MakeNormalVector(&x,&y);791 x.RotateVector(&z,(alpha-tmp)*M_PI/180.);792 x.AddVector(&second->x);793 first->x.CopyVector(&x);794 // check new angle795 x.CopyVector((const Vector *)&first->x);796 x.SubtractVector((const Vector *)&second->x);797 alpha = (acos(x.ScalarProduct((const Vector *)&y)/(y.Norm()*x.Norm()))/M_PI*180.);798 cout << Verbose(0) << "new Bond angle between first atom Nr." << first->nr << ", central atom Nr." << second->nr << " and last atom Nr." << third->nr << ": ";799 cout << Verbose(0) << alpha << " degrees" << endl;800 }801 break;802 803 case 'u': // change an atom's element804 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)805 if ((*ListRunner)->ActiveFlag) {806 int Z;807 mol = *ListRunner;808 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);809 first = NULL;810 do {811 DoLog(0) && (Log() << Verbose(0) << "Change the element of which atom: ");812 cin >> Z;813 } while ((first = mol->FindAtom(Z)) == NULL);814 DoLog(0) && (Log() << Verbose(0) << "New element by atomic number Z: ");815 cin >> Z;816 first->type = periode->FindElement(Z);817 DoLog(0) && (Log() << Verbose(0) << "Atom " << first->nr << "'s element is " << first->type->name << "." << endl);818 }819 break;820 }821 };822 823 /** Submenu for manipulating molecules.824 * \param *periode periodentafel825 * \param *molecules list of molecule to manipulate826 */827 static void ManipulateMolecules(periodentafel *periode, MoleculeListClass *molecules, config *configuration)828 {829 atom *first = NULL;830 Vector x,y,z,n; // coordinates for absolute point in cell volume831 int j, axis, count, faktor;832 char choice; // menu choice char833 molecule *mol = NULL;834 element **Elements;835 Vector **vectors;836 MoleculeLeafClass *Subgraphs = NULL;837 838 DoLog(0) && (Log() << Verbose(0) << "=========MANIPULATE GLOBALLY===================" << endl);839 DoLog(0) && (Log() << Verbose(0) << "c - scale by unit transformation" << endl);840 DoLog(0) && (Log() << Verbose(0) << "d - duplicate molecule/periodic cell" << endl);841 DoLog(0) && (Log() << Verbose(0) << "f - fragment molecule many-body bond order style" << endl);842 DoLog(0) && (Log() << Verbose(0) << "g - center atoms in box" << endl);843 DoLog(0) && (Log() << Verbose(0) << "i - realign molecule" << endl);844 DoLog(0) && (Log() << Verbose(0) << "m - mirror all molecules" << endl);845 DoLog(0) && (Log() << Verbose(0) << "o - create connection matrix" << endl);846 DoLog(0) && (Log() << Verbose(0) << "t - translate molecule by vector" << endl);847 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);848 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);849 if (molecules->NumberOfActiveMolecules() > 1)850 DoeLog(2) && (eLog()<< Verbose(2) << "There is more than one molecule active! Atoms will be added to each." << endl);851 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");852 cin >> choice;853 854 switch (choice) {855 default:856 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl);857 break;858 859 case 'd': // duplicate the periodic cell along a given axis, given times860 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)861 if ((*ListRunner)->ActiveFlag) {862 mol = *ListRunner;863 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);864 DoLog(0) && (Log() << Verbose(0) << "State the axis [(+-)123]: ");865 cin >> axis;866 DoLog(0) && (Log() << Verbose(0) << "State the factor: ");867 cin >> faktor;868 869 mol->CountAtoms(); // recount atoms870 if (mol->getAtomCount() != 0) { // if there is more than none871 count = mol->getAtomCount(); // is changed becausing of adding, thus has to be stored away beforehand872 Elements = new element *[count];873 vectors = new Vector *[count];874 j = 0;875 first = mol->start;876 while (first->next != mol->end) { // make a list of all atoms with coordinates and element877 first = first->next;878 Elements[j] = first->type;879 vectors[j] = &first->x;880 j++;881 }882 if (count != j)883 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl);884 x.Zero();885 y.Zero();886 y.x[abs(axis)-1] = World::getInstance().getDomain()[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] * abs(axis)/axis; // last term is for sign, first is for magnitude887 for (int i=1;i<faktor;i++) { // then add this list with respective translation factor times888 x.AddVector(&y); // per factor one cell width further889 for (int k=count;k--;) { // go through every atom of the original cell890 first = new atom(); // create a new body891 first->x.CopyVector(vectors[k]); // use coordinate of original atom892 first->x.AddVector(&x); // translate the coordinates893 first->type = Elements[k]; // insert original element894 mol->AddAtom(first); // and add to the molecule (which increments ElementsInMolecule, AtomCount, ...)895 }896 }897 if (mol->first->next != mol->last) // if connect matrix is present already, redo it898 mol->CreateAdjacencyList(mol->BondDistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);899 // free memory900 delete[](Elements);901 delete[](vectors);902 // correct cell size903 if (axis < 0) { // if sign was negative, we have to translate everything904 x.Zero();905 x.AddVector(&y);906 x.Scale(-(faktor-1));907 mol->Translate(&x);908 }909 World::getInstance().getDomain()[(abs(axis) == 2) ? 2 : ((abs(axis) == 3) ? 5 : 0)] *= faktor;910 }911 }912 break;913 914 case 'f':915 FragmentAtoms(mol, configuration);916 break;917 918 case 'g': // center the atoms919 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)920 if ((*ListRunner)->ActiveFlag) {921 mol = *ListRunner;922 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);923 CenterAtoms(mol);924 }925 break;926 927 case 'i': // align all atoms928 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)929 if ((*ListRunner)->ActiveFlag) {930 mol = *ListRunner;931 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);932 AlignAtoms(periode, mol);933 }934 break;935 936 case 'm': // mirror atoms along a given axis937 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)938 if ((*ListRunner)->ActiveFlag) {939 mol = *ListRunner;940 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);941 MirrorAtoms(mol);942 }943 break;944 945 case 'o': // create the connection matrix946 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)947 if ((*ListRunner)->ActiveFlag) {948 mol = *ListRunner;949 double bonddistance;950 clock_t start,end;951 DoLog(0) && (Log() << Verbose(0) << "What's the maximum bond distance: ");952 cin >> bonddistance;953 start = clock();954 mol->CreateAdjacencyList(bonddistance, configuration->GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);955 end = clock();956 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl);957 }958 break;959 960 case 't': // translate all atoms961 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)962 if ((*ListRunner)->ActiveFlag) {963 mol = *ListRunner;964 DoLog(0) && (Log() << Verbose(0) << "Current molecule is: " << mol->IndexNr << "\t" << mol->name << endl);965 DoLog(0) && (Log() << Verbose(0) << "Enter translation vector." << endl);966 x.AskPosition(World::getInstance().getDomain(),0);967 mol->Center.AddVector((const Vector *)&x);968 }969 break;970 }971 // Free all972 if (Subgraphs != NULL) { // free disconnected subgraph list of DFS analysis was performed973 while (Subgraphs->next != NULL) {974 Subgraphs = Subgraphs->next;975 delete(Subgraphs->previous);976 }977 delete(Subgraphs);978 }979 };980 981 982 /** Submenu for creating new molecules.983 * \param *periode periodentafel984 * \param *molecules list of molecules to add to985 */986 static void EditMolecules(periodentafel *periode, MoleculeListClass *molecules)987 {988 char choice; // menu choice char989 Vector center;990 int nr, count;991 molecule *mol = NULL;992 993 DoLog(0) && (Log() << Verbose(0) << "==========EDIT MOLECULES=====================" << endl);994 DoLog(0) && (Log() << Verbose(0) << "c - create new molecule" << endl);995 DoLog(0) && (Log() << Verbose(0) << "l - load molecule from xyz file" << endl);996 DoLog(0) && (Log() << Verbose(0) << "n - change molecule's name" << endl);997 DoLog(0) && (Log() << Verbose(0) << "N - give molecules filename" << endl);998 DoLog(0) && (Log() << Verbose(0) << "p - parse atoms in xyz file into molecule" << endl);999 DoLog(0) && (Log() << Verbose(0) << "r - remove a molecule" << endl);1000 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);1001 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);1002 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");1003 cin >> choice;1004 1005 switch (choice) {1006 default:1007 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl);1008 break;1009 case 'c':1010 mol = World::getInstance().createMolecule();1011 molecules->insert(mol);1012 break;1013 1014 case 'l': // load from XYZ file1015 {1016 char filename[MAXSTRINGSIZE];1017 DoLog(0) && (Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl);1018 mol = World::getInstance().createMolecule();1019 do {1020 DoLog(0) && (Log() << Verbose(0) << "Enter file name: ");1021 cin >> filename;1022 } while (!mol->AddXYZFile(filename));1023 mol->SetNameFromFilename(filename);1024 // center at set box dimensions1025 mol->CenterEdge(¢er);1026 double * const cell_size = World::getInstance().getDomain();1027 cell_size[0] = center.x[0];1028 cell_size[1] = 0;1029 cell_size[2] = center.x[1];1030 cell_size[3] = 0;1031 cell_size[4] = 0;1032 cell_size[5] = center.x[2];1033 molecules->insert(mol);1034 }1035 break;1036 1037 case 'n':1038 {1039 char filename[MAXSTRINGSIZE];1040 do {1041 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: ");1042 cin >> nr;1043 mol = molecules->ReturnIndex(nr);1044 } while (mol == NULL);1045 DoLog(0) && (Log() << Verbose(0) << "Enter name: ");1046 cin >> filename;1047 strcpy(mol->name, filename);1048 }1049 break;1050 1051 case 'N':1052 {1053 char filename[MAXSTRINGSIZE];1054 do {1055 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: ");1056 cin >> nr;1057 mol = molecules->ReturnIndex(nr);1058 } while (mol == NULL);1059 DoLog(0) && (Log() << Verbose(0) << "Enter name: ");1060 cin >> filename;1061 mol->SetNameFromFilename(filename);1062 }1063 break;1064 1065 case 'p': // parse XYZ file1066 {1067 char filename[MAXSTRINGSIZE];1068 mol = NULL;1069 do {1070 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: ");1071 cin >> nr;1072 mol = molecules->ReturnIndex(nr);1073 } while (mol == NULL);1074 DoLog(0) && (Log() << Verbose(0) << "Format should be XYZ with: ShorthandOfElement\tX\tY\tZ" << endl);1075 do {1076 DoLog(0) && (Log() << Verbose(0) << "Enter file name: ");1077 cin >> filename;1078 } while (!mol->AddXYZFile(filename));1079 mol->SetNameFromFilename(filename);1080 }1081 break;1082 1083 case 'r':1084 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule: ");1085 cin >> nr;1086 count = 1;1087 for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)1088 if (nr == (*ListRunner)->IndexNr) {1089 mol = *ListRunner;1090 molecules->ListOfMolecules.erase(ListRunner);1091 delete(mol);1092 break;1093 }1094 break;1095 }1096 };1097 1098 1099 /** Submenu for merging molecules.1100 * \param *periode periodentafel1101 * \param *molecules list of molecules to add to1102 */1103 static void MergeMolecules(periodentafel *periode, MoleculeListClass *molecules)1104 {1105 char choice; // menu choice char1106 1107 DoLog(0) && (Log() << Verbose(0) << "===========MERGE MOLECULES=====================" << endl);1108 DoLog(0) && (Log() << Verbose(0) << "a - simple add of one molecule to another" << endl);1109 DoLog(0) && (Log() << Verbose(0) << "b - count the number of bonds of two elements" << endl);1110 DoLog(0) && (Log() << Verbose(0) << "B - count the number of bonds of three elements " << endl);1111 DoLog(0) && (Log() << Verbose(0) << "e - embedding merge of two molecules" << endl);1112 DoLog(0) && (Log() << Verbose(0) << "h - count the number of hydrogen bonds" << endl);1113 DoLog(0) && (Log() << Verbose(0) << "b - count the number of hydrogen bonds" << endl);1114 DoLog(0) && (Log() << Verbose(0) << "m - multi-merge of all molecules" << endl);1115 DoLog(0) && (Log() << Verbose(0) << "s - scatter merge of two molecules" << endl);1116 DoLog(0) && (Log() << Verbose(0) << "t - simple merge of two molecules" << endl);1117 DoLog(0) && (Log() << Verbose(0) << "all else - go back" << endl);1118 DoLog(0) && (Log() << Verbose(0) << "===============================================" << endl);1119 DoLog(0) && (Log() << Verbose(0) << "INPUT: ");1120 cin >> choice;1121 1122 switch (choice) {1123 default:1124 DoLog(0) && (Log() << Verbose(0) << "Not a valid choice." << endl);1125 break;1126 1127 case 'a':1128 {1129 int src, dest;1130 molecule *srcmol = NULL, *destmol = NULL;1131 {1132 do {1133 DoLog(0) && (Log() << Verbose(0) << "Enter index of destination molecule: ");1134 cin >> dest;1135 destmol = molecules->ReturnIndex(dest);1136 } while ((destmol == NULL) && (dest != -1));1137 do {1138 DoLog(0) && (Log() << Verbose(0) << "Enter index of source molecule to add from: ");1139 cin >> src;1140 srcmol = molecules->ReturnIndex(src);1141 } while ((srcmol == NULL) && (src != -1));1142 if ((src != -1) && (dest != -1))1143 molecules->SimpleAdd(srcmol, destmol);1144 }1145 }1146 break;1147 1148 case 'b':1149 {1150 const int nr = 2;1151 char *names[nr] = {"first", "second"};1152 int Z[nr];1153 element *elements[nr];1154 for (int i=0;i<nr;i++) {1155 Z[i] = 0;1156 do {1157 cout << "Enter " << names[i] << " element: ";1158 cin >> Z[i];1159 } while ((Z[i] <= 0) && (Z[i] > MAX_ELEMENTS));1160 elements[i] = periode->FindElement(Z[i]);1161 }1162 const int count = CountBondsOfTwo(molecules, elements[0], elements[1]);1163 cout << endl << "There are " << count << " ";1164 for (int i=0;i<nr;i++) {1165 if (i==0)1166 cout << elements[i]->symbol;1167 else1168 cout << "-" << elements[i]->symbol;1169 }1170 cout << " bonds." << endl;1171 }1172 break;1173 1174 case 'B':1175 {1176 const int nr = 3;1177 char *names[nr] = {"first", "second", "third"};1178 int Z[nr];1179 element *elements[nr];1180 for (int i=0;i<nr;i++) {1181 Z[i] = 0;1182 do {1183 cout << "Enter " << names[i] << " element: ";1184 cin >> Z[i];1185 } while ((Z[i] <= 0) && (Z[i] > MAX_ELEMENTS));1186 elements[i] = periode->FindElement(Z[i]);1187 }1188 const int count = CountBondsOfThree(molecules, elements[0], elements[1], elements[2]);1189 cout << endl << "There are " << count << " ";1190 for (int i=0;i<nr;i++) {1191 if (i==0)1192 cout << elements[i]->symbol;1193 else1194 cout << "-" << elements[i]->symbol;1195 }1196 cout << " bonds." << endl;1197 }1198 break;1199 1200 case 'e':1201 {1202 int src, dest;1203 molecule *srcmol = NULL, *destmol = NULL;1204 do {1205 DoLog(0) && (Log() << Verbose(0) << "Enter index of matrix molecule (the variable one): ");1206 cin >> src;1207 srcmol = molecules->ReturnIndex(src);1208 } while ((srcmol == NULL) && (src != -1));1209 do {1210 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule to merge into (the fixed one): ");1211 cin >> dest;1212 destmol = molecules->ReturnIndex(dest);1213 } while ((destmol == NULL) && (dest != -1));1214 if ((src != -1) && (dest != -1))1215 molecules->EmbedMerge(destmol, srcmol);1216 }1217 break;1218 1219 case 'h':1220 {1221 int Z;1222 cout << "Please enter interface element: ";1223 cin >> Z;1224 element * const InterfaceElement = periode->FindElement(Z);1225 cout << endl << "There are " << CountHydrogenBridgeBonds(molecules, InterfaceElement) << " hydrogen bridges with connections to " << (InterfaceElement != 0 ? InterfaceElement->name : "None") << "." << endl;1226 }1227 break;1228 1229 case 'm':1230 {1231 int nr;1232 molecule *mol = NULL;1233 do {1234 DoLog(0) && (Log() << Verbose(0) << "Enter index of molecule to merge into: ");1235 cin >> nr;1236 mol = molecules->ReturnIndex(nr);1237 } while ((mol == NULL) && (nr != -1));1238 if (nr != -1) {1239 int N = molecules->ListOfMolecules.size()-1;1240 int *src = new int(N);1241 for(MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)1242 if ((*ListRunner)->IndexNr != nr)1243 src[N++] = (*ListRunner)->IndexNr;1244 molecules->SimpleMultiMerge(mol, src, N);1245 delete[](src);1246 }1247 }1248 break;1249 1250 case 's':1251 DoLog(0) && (Log() << Verbose(0) << "Not implemented yet." << endl);1252 break;1253 1254 case 't':1255 {1256 int src, dest;1257 molecule *srcmol = NULL, *destmol = NULL;1258 {1259 do {1260 DoLog(0) && (Log() << Verbose(0) << "Enter index of destination molecule: ");1261 cin >> dest;1262 destmol = molecules->ReturnIndex(dest);1263 } while ((destmol == NULL) && (dest != -1));1264 do {1265 DoLog(0) && (Log() << Verbose(0) << "Enter index of source molecule to merge into: ");1266 cin >> src;1267 srcmol = molecules->ReturnIndex(src);1268 } while ((srcmol == NULL) && (src != -1));1269 if ((src != -1) && (dest != -1))1270 molecules->SimpleMerge(srcmol, destmol);1271 }1272 }1273 break;1274 }1275 };1276 1277 /********************************************** Test routine **************************************/1278 1279 /** Is called always as option 'T' in the menu.1280 * \param *molecules list of molecules1281 */1282 static void testroutine(MoleculeListClass *molecules)1283 {1284 // the current test routine checks the functionality of the KeySet&Graph concept:1285 // We want to have a multiindex (the KeySet) describing a unique subgraph1286 int i, comp, counter=0;1287 1288 // create a clone1289 molecule *mol = NULL;1290 if (molecules->ListOfMolecules.size() != 0) // clone1291 mol = (molecules->ListOfMolecules.front())->CopyMolecule();1292 else {1293 DoeLog(0) && (eLog()<< Verbose(0) << "I don't have anything to test on ... ");1294 performCriticalExit();1295 return;1296 }1297 atom *Walker = mol->start;1298 1299 // generate some KeySets1300 DoLog(0) && (Log() << Verbose(0) << "Generating KeySets." << endl);1301 KeySet TestSets[mol->getAtomCount()+1];1302 i=1;1303 while (Walker->next != mol->end) {1304 Walker = Walker->next;1305 for (int j=0;j<i;j++) {1306 TestSets[j].insert(Walker->nr);1307 }1308 i++;1309 }1310 DoLog(0) && (Log() << Verbose(0) << "Testing insertion of already present item in KeySets." << endl);1311 KeySetTestPair test;1312 test = TestSets[mol->getAtomCount()-1].insert(Walker->nr);1313 if (test.second) {1314 DoLog(1) && (Log() << Verbose(1) << "Insertion worked?!" << endl);1315 } else {1316 DoLog(1) && (Log() << Verbose(1) << "Insertion rejected: Present object is " << (*test.first) << "." << endl);1317 }1318 TestSets[mol->getAtomCount()].insert(mol->end->previous->nr);1319 TestSets[mol->getAtomCount()].insert(mol->end->previous->previous->previous->nr);1320 1321 // constructing Graph structure1322 DoLog(0) && (Log() << Verbose(0) << "Generating Subgraph class." << endl);1323 Graph Subgraphs;1324 1325 // insert KeySets into Subgraphs1326 DoLog(0) && (Log() << Verbose(0) << "Inserting KeySets into Subgraph class." << endl);1327 for (int j=0;j<mol->getAtomCount();j++) {1328 Subgraphs.insert(GraphPair (TestSets[j],pair<int, double>(counter++, 1.)));1329 }1330 DoLog(0) && (Log() << Verbose(0) << "Testing insertion of already present item in Subgraph." << endl);1331 GraphTestPair test2;1332 test2 = Subgraphs.insert(GraphPair (TestSets[mol->getAtomCount()],pair<int, double>(counter++, 1.)));1333 if (test2.second) {1334 DoLog(1) && (Log() << Verbose(1) << "Insertion worked?!" << endl);1335 } else {1336 DoLog(1) && (Log() << Verbose(1) << "Insertion rejected: Present object is " << (*(test2.first)).second.first << "." << endl);1337 }1338 1339 // show graphs1340 DoLog(0) && (Log() << Verbose(0) << "Showing Subgraph's contents, checking that it's sorted." << endl);1341 Graph::iterator A = Subgraphs.begin();1342 while (A != Subgraphs.end()) {1343 DoLog(0) && (Log() << Verbose(0) << (*A).second.first << ": ");1344 KeySet::iterator key = (*A).first.begin();1345 comp = -1;1346 while (key != (*A).first.end()) {1347 if ((*key) > comp)1348 DoLog(0) && (Log() << Verbose(0) << (*key) << " ");1349 else1350 DoLog(0) && (Log() << Verbose(0) << (*key) << "! ");1351 comp = (*key);1352 key++;1353 }1354 DoLog(0) && (Log() << Verbose(0) << endl);1355 A++;1356 }1357 delete(mol);1358 };1359 1360 1361 /** Tries given filename or standard on saving the config file.1362 * \param *ConfigFileName name of file1363 * \param *configuration pointer to configuration structure with all the values1364 * \param *periode pointer to periodentafel structure with all the elements1365 * \param *molecules list of molecules structure with all the atoms and coordinates1366 */1367 static void SaveConfig(char *ConfigFileName, config *configuration, periodentafel *periode, MoleculeListClass *molecules)1368 {1369 char filename[MAXSTRINGSIZE];1370 ofstream output;1371 molecule *mol = World::getInstance().createMolecule();1372 mol->SetNameFromFilename(ConfigFileName);1373 1374 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) {1375 DoeLog(2) && (eLog()<< Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl);1376 }1377 1378 1379 // first save as PDB data1380 if (ConfigFileName != NULL)1381 strcpy(filename, ConfigFileName);1382 if (output == NULL)1383 strcpy(filename,"main_pcp_linux");1384 DoLog(0) && (Log() << Verbose(0) << "Saving as pdb input ");1385 if (configuration->SavePDB(filename, molecules))1386 DoLog(0) && (Log() << Verbose(0) << "done." << endl);1387 else1388 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1389 1390 // then save as tremolo data file1391 if (ConfigFileName != NULL)1392 strcpy(filename, ConfigFileName);1393 if (output == NULL)1394 strcpy(filename,"main_pcp_linux");1395 DoLog(0) && (Log() << Verbose(0) << "Saving as tremolo data input ");1396 if (configuration->SaveTREMOLO(filename, molecules))1397 DoLog(0) && (Log() << Verbose(0) << "done." << endl);1398 else1399 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1400 1401 // translate each to its center and merge all molecules in MoleculeListClass into this molecule1402 int N = molecules->ListOfMolecules.size();1403 int *src = new int[N];1404 N=0;1405 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) {1406 src[N++] = (*ListRunner)->IndexNr;1407 (*ListRunner)->Translate(&(*ListRunner)->Center);1408 }1409 molecules->SimpleMultiAdd(mol, src, N);1410 delete[](src);1411 1412 // ... and translate back1413 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) {1414 (*ListRunner)->Center.Scale(-1.);1415 (*ListRunner)->Translate(&(*ListRunner)->Center);1416 (*ListRunner)->Center.Scale(-1.);1417 }1418 1419 DoLog(0) && (Log() << Verbose(0) << "Storing configuration ... " << endl);1420 // get correct valence orbitals1421 mol->CalculateOrbitals(*configuration);1422 configuration->InitMaxMinStopStep = configuration->MaxMinStopStep = configuration->MaxPsiDouble;1423 if (ConfigFileName != NULL) { // test the file name1424 strcpy(filename, ConfigFileName);1425 output.open(filename, ios::trunc);1426 } else if (strlen(configuration->configname) != 0) {1427 strcpy(filename, configuration->configname);1428 output.open(configuration->configname, ios::trunc);1429 } else {1430 strcpy(filename, DEFAULTCONFIG);1431 output.open(DEFAULTCONFIG, ios::trunc);1432 }1433 output.close();1434 output.clear();1435 DoLog(0) && (Log() << Verbose(0) << "Saving of config file ");1436 if (configuration->Save(filename, periode, mol))1437 DoLog(0) && (Log() << Verbose(0) << "successful." << endl);1438 else1439 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1440 1441 // and save to xyz file1442 if (ConfigFileName != NULL) {1443 strcpy(filename, ConfigFileName);1444 strcat(filename, ".xyz");1445 output.open(filename, ios::trunc);1446 }1447 if (output == NULL) {1448 strcpy(filename,"main_pcp_linux");1449 strcat(filename, ".xyz");1450 output.open(filename, ios::trunc);1451 }1452 DoLog(0) && (Log() << Verbose(0) << "Saving of XYZ file ");1453 if (mol->MDSteps <= 1) {1454 if (mol->OutputXYZ(&output))1455 DoLog(0) && (Log() << Verbose(0) << "successful." << endl);1456 else1457 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1458 } else {1459 if (mol->OutputTrajectoriesXYZ(&output))1460 DoLog(0) && (Log() << Verbose(0) << "successful." << endl);1461 else1462 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1463 }1464 output.close();1465 output.clear();1466 1467 // and save as MPQC configuration1468 if (ConfigFileName != NULL)1469 strcpy(filename, ConfigFileName);1470 if (output == NULL)1471 strcpy(filename,"main_pcp_linux");1472 DoLog(0) && (Log() << Verbose(0) << "Saving as mpqc input ");1473 if (configuration->SaveMPQC(filename, mol))1474 DoLog(0) && (Log() << Verbose(0) << "done." << endl);1475 else1476 DoLog(0) && (Log() << Verbose(0) << "failed." << endl);1477 1478 if (!strcmp(configuration->configpath, configuration->GetDefaultPath())) {1479 DoeLog(2) && (eLog()<< Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl);1480 }1481 1482 World::getInstance().destroyMolecule(mol);1483 };1484 1485 #endif1486 1487 /** Parses the command line options.1488 * Note that this function is from now on transitional. All commands that are not passed1489 * here are handled by CommandLineParser and the actions of CommandLineUIFactory.1490 * \param argc argument count1491 * \param **argv arguments array1492 * \param *molecules list of molecules structure1493 * \param *periode elements structure1494 * \param configuration config file structure1495 * \param *ConfigFileName pointer to config file name in **argv1496 * \param *PathToDatabases pointer to db's path in **argv1497 * \param &ArgcList list of arguments that we do not parse here1498 * \return exit code (0 - successful, all else - something's wrong)1499 */1500 static int ParseCommandLineOptions(int argc, char **argv, MoleculeListClass *&molecules, periodentafel *&periode,1501 config& configuration, char **ConfigFileName, set<int> &ArgcList)1502 {1503 Vector x,y,z,n; // coordinates for absolute point in cell volume1504 ifstream test;1505 ofstream output;1506 string line;1507 bool SaveFlag = false;1508 int ExitFlag = 0;1509 int j;1510 double volume = 0.;1511 enum ConfigStatus configPresent = absent;1512 int argptr;1513 molecule *mol = NULL;1514 string BondGraphFileName("\n");1515 1516 if (argc > 1) { // config file specified as option1517 // 1. : Parse options that just set variables or print help1518 argptr = 1;1519 do {1520 if (argv[argptr][0] == '-') {1521 DoLog(0) && (Log() << Verbose(0) << "Recognized command line argument: " << argv[argptr][1] << ".\n");1522 argptr++;1523 switch(argv[argptr-1][1]) {1524 case 'h':1525 case 'H':1526 case '?':1527 ArgcList.insert(argptr-1);1528 return(1);1529 break;1530 case 'v':1531 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1532 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying verbosity: -v <level>" << endl);1533 performCriticalExit();1534 } else {1535 setVerbosity(atoi(argv[argptr]));1536 ArgcList.insert(argptr-1);1537 ArgcList.insert(argptr);1538 argptr++;1539 }1540 break;1541 case 'V':1542 ArgcList.insert(argptr-1);1543 return(1);1544 break;1545 case 'B':1546 if (ExitFlag == 0) ExitFlag = 1;1547 if ((argptr+5 >= argc)) {1548 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for setting Box: -B <xx> <<xy> <<xz> <yy> <yz> <zz>" << endl);1549 performCriticalExit();1550 } else {1551 ArgcList.insert(argptr-1);1552 ArgcList.insert(argptr);1553 ArgcList.insert(argptr+1);1554 ArgcList.insert(argptr+2);1555 ArgcList.insert(argptr+3);1556 ArgcList.insert(argptr+4);1557 ArgcList.insert(argptr+5);1558 argptr+=6;1559 }1560 break;1561 case 'e':1562 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1563 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying element db: -e <db file>" << endl);1564 performCriticalExit();1565 } else {1566 ArgcList.insert(argptr-1);1567 ArgcList.insert(argptr);1568 argptr+=1;1569 }1570 break;1571 case 'g':1572 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1573 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying bond length table: -g <table file>" << endl);1574 performCriticalExit();1575 } else {1576 ArgcList.insert(argptr-1);1577 ArgcList.insert(argptr);1578 argptr+=1;1579 }1580 break;1581 case 'M':1582 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1583 ExitFlag = 255;1584 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting MPQC basis: -M <basis name>" << endl);1585 performCriticalExit();1586 } else {1587 ArgcList.insert(argptr-1);1588 ArgcList.insert(argptr);1589 argptr+=1;1590 }1591 break;1592 case 'n':1593 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1594 ExitFlag = 255;1595 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting fast-parsing: -n <0/1>" << endl);1596 performCriticalExit();1597 } else {1598 ArgcList.insert(argptr-1);1599 ArgcList.insert(argptr);1600 argptr+=1;1601 }1602 break;1603 case 'X':1604 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1605 ExitFlag = 255;1606 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting default molecule name: -X <name>" << endl);1607 performCriticalExit();1608 } else {1609 ArgcList.insert(argptr-1);1610 ArgcList.insert(argptr);1611 argptr+=1;1612 }1613 break;1614 default: // no match? Step on1615 argptr++;1616 break;1617 }1618 } else1619 argptr++;1620 } while (argptr < argc);1621 1622 // 3b. Find config file name and parse if possible, also BondGraphFileName1623 if (argv[1][0] != '-') {1624 // simply create a new molecule, wherein the config file is loaded and the manipulation takes place1625 DoLog(0) && (Log() << Verbose(0) << "Config file given." << endl);1626 test.open(argv[1], ios::in);1627 if (test == NULL) {1628 //return (1);1629 output.open(argv[1], ios::out);1630 if (output == NULL) {1631 DoLog(1) && (Log() << Verbose(1) << "Specified config file " << argv[1] << " not found." << endl);1632 configPresent = absent;1633 } else {1634 DoLog(0) && (Log() << Verbose(0) << "Empty configuration file." << endl);1635 strcpy(*ConfigFileName, argv[1]);1636 configPresent = empty;1637 output.close();1638 }1639 } else {1640 test.close();1641 strcpy(*ConfigFileName, argv[1]);1642 DoLog(1) && (Log() << Verbose(1) << "Specified config file found, parsing ... ");1643 switch (configuration.TestSyntax(*ConfigFileName, periode)) {1644 case 1:1645 DoLog(0) && (Log() << Verbose(0) << "new syntax." << endl);1646 configuration.Load(*ConfigFileName, BondGraphFileName, periode, molecules);1647 configPresent = present;1648 break;1649 case 0:1650 DoLog(0) && (Log() << Verbose(0) << "old syntax." << endl);1651 configuration.LoadOld(*ConfigFileName, BondGraphFileName, periode, molecules);1652 configPresent = present;1653 break;1654 default:1655 DoLog(0) && (Log() << Verbose(0) << "Unknown syntax or empty, yet present file." << endl);1656 configPresent = empty;1657 }1658 }1659 } else1660 configPresent = absent;1661 // set mol to first active molecule1662 if (molecules->ListOfMolecules.size() != 0) {1663 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)1664 if ((*ListRunner)->ActiveFlag) {1665 mol = *ListRunner;1666 break;1667 }1668 }1669 if (mol == NULL) {1670 mol = World::getInstance().createMolecule();1671 mol->ActiveFlag = true;1672 if (*ConfigFileName != NULL)1673 mol->SetNameFromFilename(*ConfigFileName);1674 molecules->insert(mol);1675 }1676 1677 // 4. parse again through options, now for those depending on elements db and config presence1678 argptr = 1;1679 do {1680 DoLog(0) && (Log() << Verbose(0) << "Current Command line argument: " << argv[argptr] << "." << endl);1681 if (argv[argptr][0] == '-') {1682 argptr++;1683 if ((configPresent == present) || (configPresent == empty)) {1684 switch(argv[argptr-1][1]) {1685 case 'p':1686 if (ExitFlag == 0) ExitFlag = 1;1687 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1688 ExitFlag = 255;1689 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough arguments for parsing: -p <xyz file>" << endl);1690 performCriticalExit();1691 } else {1692 SaveFlag = true;1693 DoLog(1) && (Log() << Verbose(1) << "Parsing xyz file for new atoms." << endl);1694 if (!mol->AddXYZFile(argv[argptr]))1695 DoLog(2) && (Log() << Verbose(2) << "File not found." << endl);1696 else {1697 DoLog(2) && (Log() << Verbose(2) << "File found and parsed." << endl);1698 configPresent = present;1699 }1700 }1701 break;1702 case 'a':1703 if (ExitFlag == 0) ExitFlag = 1;1704 if ((argptr+4 >= argc) || (argv[argptr][0] == '-')) {1705 ExitFlag = 255;1706 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough arguments for adding atom: -a <Z> --position <x> <y> <z>" << endl);1707 performCriticalExit();1708 } else {1709 ArgcList.insert(argptr-1);1710 ArgcList.insert(argptr);1711 ArgcList.insert(argptr+1);1712 ArgcList.insert(argptr+2);1713 ArgcList.insert(argptr+3);1714 ArgcList.insert(argptr+4);1715 argptr+=5;1716 }1717 break;1718 default: // no match? Don't step on (this is done in next switch's default)1719 break;1720 }1721 }1722 if (configPresent == present) {1723 switch(argv[argptr-1][1]) {1724 case 'D':1725 if (ExitFlag == 0) ExitFlag = 1;1726 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1727 ExitFlag = 255;1728 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for depth-first-search analysis: -D <max. bond distance>" << endl);1729 performCriticalExit();1730 } else {1731 ArgcList.insert(argptr-1);1732 ArgcList.insert(argptr);1733 argptr+=1;1734 }1735 break;1736 case 'I':1737 DoLog(1) && (Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl);1738 ArgcList.insert(argptr-1);1739 argptr+=0;1740 break;1741 case 'C':1742 {1743 if (ExitFlag == 0) ExitFlag = 1;1744 if ((argptr+11 >= argc)) {1745 ExitFlag = 255;1746 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C[p] <type: E/P/S> [more params] <output> <bin output> <BinStart> <BinEnd>" << endl);1747 performCriticalExit();1748 } else {1749 switch(argv[argptr][0]) {1750 case 'E':1751 ArgcList.insert(argptr-1);1752 ArgcList.insert(argptr);1753 ArgcList.insert(argptr+1);1754 ArgcList.insert(argptr+2);1755 ArgcList.insert(argptr+3);1756 ArgcList.insert(argptr+4);1757 ArgcList.insert(argptr+5);1758 ArgcList.insert(argptr+6);1759 ArgcList.insert(argptr+7);1760 ArgcList.insert(argptr+8);1761 ArgcList.insert(argptr+9);1762 ArgcList.insert(argptr+10);1763 ArgcList.insert(argptr+11);1764 argptr+=12;1765 break;1766 1767 case 'P':1768 ArgcList.insert(argptr-1);1769 ArgcList.insert(argptr);1770 ArgcList.insert(argptr+1);1771 ArgcList.insert(argptr+2);1772 ArgcList.insert(argptr+3);1773 ArgcList.insert(argptr+4);1774 ArgcList.insert(argptr+5);1775 ArgcList.insert(argptr+6);1776 ArgcList.insert(argptr+7);1777 ArgcList.insert(argptr+8);1778 ArgcList.insert(argptr+9);1779 ArgcList.insert(argptr+10);1780 ArgcList.insert(argptr+11);1781 ArgcList.insert(argptr+12);1782 ArgcList.insert(argptr+13);1783 ArgcList.insert(argptr+14);1784 argptr+=15;1785 break;1786 1787 case 'S':1788 ArgcList.insert(argptr-1);1789 ArgcList.insert(argptr);1790 ArgcList.insert(argptr+1);1791 ArgcList.insert(argptr+2);1792 ArgcList.insert(argptr+3);1793 ArgcList.insert(argptr+4);1794 ArgcList.insert(argptr+5);1795 ArgcList.insert(argptr+6);1796 ArgcList.insert(argptr+7);1797 ArgcList.insert(argptr+8);1798 ArgcList.insert(argptr+9);1799 ArgcList.insert(argptr+10);1800 ArgcList.insert(argptr+11);1801 ArgcList.insert(argptr+12);1802 ArgcList.insert(argptr+13);1803 ArgcList.insert(argptr+14);1804 argptr+=15;1805 break;1806 1807 default:1808 ExitFlag = 255;1809 DoeLog(0) && (eLog()<< Verbose(0) << "Invalid type given for pair correlation analysis: -C <type: E/P/S> [more params] <output> <bin output>" << endl);1810 performCriticalExit();1811 break;1812 }1813 }1814 break;1815 }1816 case 'E':1817 if (ExitFlag == 0) ExitFlag = 1;1818 if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr]))) {1819 ExitFlag = 255;1820 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for changing element: -E <atom nr.> --element <Z>" << endl);1821 performCriticalExit();1822 } else {1823 ArgcList.insert(argptr-1);1824 ArgcList.insert(argptr);1825 ArgcList.insert(argptr+1);1826 ArgcList.insert(argptr+2);1827 argptr+=3;1828 }1829 break;1830 case 'F':1831 if (ExitFlag == 0) ExitFlag = 1;1832 if ((argptr+12 >= argc) || (argv[argptr][0] == '-')) {1833 ExitFlag = 255;1834 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for filling with molecule: -F <filler xyz file> --MaxDistance <distance or -1> --distances <x> <y> <z> --lengths <surface> <randatm> <randmol> --DoRotate <0/1>" << endl);1835 performCriticalExit();1836 } else {1837 ArgcList.insert(argptr-1);1838 ArgcList.insert(argptr);1839 ArgcList.insert(argptr+1);1840 ArgcList.insert(argptr+2);1841 ArgcList.insert(argptr+3);1842 ArgcList.insert(argptr+4);1843 ArgcList.insert(argptr+5);1844 ArgcList.insert(argptr+6);1845 ArgcList.insert(argptr+7);1846 ArgcList.insert(argptr+8);1847 ArgcList.insert(argptr+9);1848 ArgcList.insert(argptr+10);1849 ArgcList.insert(argptr+11);1850 ArgcList.insert(argptr+12);1851 argptr+=13;1852 }1853 break;1854 case 'A':1855 if (ExitFlag == 0) ExitFlag = 1;1856 if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {1857 ExitFlag =255;1858 DoeLog(0) && (eLog()<< Verbose(0) << "Missing source file for bonds in molecule: -A <bond sourcefile> --molecule-by-id <molecule_id>" << endl);1859 performCriticalExit();1860 } else {1861 ArgcList.insert(argptr-1);1862 ArgcList.insert(argptr);1863 ArgcList.insert(argptr+1);1864 ArgcList.insert(argptr+2);1865 argptr+=3;1866 }1867 break;1868 1869 case 'J':1870 if (ExitFlag == 0) ExitFlag = 1;1871 if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {1872 ExitFlag =255;1873 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of adjacency file: -J <path> --molecule-by-id <molecule_id>" << endl);1874 performCriticalExit();1875 } else {1876 ArgcList.insert(argptr-1);1877 ArgcList.insert(argptr);1878 ArgcList.insert(argptr+1);1879 ArgcList.insert(argptr+2);1880 argptr+=3;1881 }1882 break;1883 1884 case 'j':1885 if (ExitFlag == 0) ExitFlag = 1;1886 if ((argptr >= argc) || (argv[argptr][0] == '-')) {1887 ExitFlag =255;1888 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of bonds file: -j <path> --molecule-by-id <molecule_id>" << endl);1889 performCriticalExit();1890 } else {1891 ArgcList.insert(argptr-1);1892 ArgcList.insert(argptr);1893 ArgcList.insert(argptr+1);1894 ArgcList.insert(argptr+2);1895 argptr+=3;1896 }1897 break;1898 1899 case 'N':1900 if (ExitFlag == 0) ExitFlag = 1;1901 if ((argptr+4 >= argc) || (argv[argptr][0] == '-')){1902 ExitFlag = 255;1903 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for non-convex envelope: -N <molecule_id> --sphere-radius <radius> --nonconvex-file <output prefix>" << endl);1904 performCriticalExit();1905 } else {1906 ArgcList.insert(argptr-1);1907 ArgcList.insert(argptr);1908 ArgcList.insert(argptr+1);1909 ArgcList.insert(argptr+2);1910 ArgcList.insert(argptr+3);1911 ArgcList.insert(argptr+4);1912 argptr+=5;1913 }1914 break;1915 case 'S':1916 if (ExitFlag == 0) ExitFlag = 1;1917 if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {1918 ExitFlag = 255;1919 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for storing tempature: -S <temperature file> --molecule-by-id 0" << endl);1920 performCriticalExit();1921 } else {1922 ArgcList.insert(argptr-1);1923 ArgcList.insert(argptr);1924 ArgcList.insert(argptr+1);1925 ArgcList.insert(argptr+2);1926 argptr+=3;1927 }1928 break;1929 case 'L':1930 if (ExitFlag == 0) ExitFlag = 1;1931 if ((argptr+8 >= argc) || (argv[argptr][0] == '-')) {1932 ExitFlag = 255;1933 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for linear interpolation: -L <prefix> --start-step <step0> --end-step <step1> --molecule-by-id 0 --id-mapping <0/1>" << endl);1934 performCriticalExit();1935 } else {1936 ArgcList.insert(argptr-1);1937 ArgcList.insert(argptr);1938 ArgcList.insert(argptr+1);1939 ArgcList.insert(argptr+2);1940 ArgcList.insert(argptr+3);1941 ArgcList.insert(argptr+4);1942 ArgcList.insert(argptr+5);1943 ArgcList.insert(argptr+6);1944 ArgcList.insert(argptr+7);1945 ArgcList.insert(argptr+8);1946 argptr+=9;1947 }1948 break;1949 case 'P':1950 if (ExitFlag == 0) ExitFlag = 1;1951 if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {1952 ExitFlag = 255;1953 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for parsing and integrating forces: -P <forces file> --molecule-by-id <molecule_id>" << endl);1954 performCriticalExit();1955 } else {1956 ArgcList.insert(argptr-1);1957 ArgcList.insert(argptr);1958 ArgcList.insert(argptr+1);1959 ArgcList.insert(argptr+2);1960 argptr+=3;1961 }1962 break;1963 case 'R':1964 if (ExitFlag == 0) ExitFlag = 1;1965 if ((argptr+4 >= argc) || (argv[argptr][0] == '-')) {1966 ExitFlag = 255;1967 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -R <distance> --position <x> <y> <z>" << endl);1968 performCriticalExit();1969 } else {1970 ArgcList.insert(argptr-1);1971 ArgcList.insert(argptr);1972 ArgcList.insert(argptr+1);1973 ArgcList.insert(argptr+2);1974 ArgcList.insert(argptr+3);1975 ArgcList.insert(argptr+4);1976 argptr+=5;1977 }1978 break;1979 case 't':1980 if (ExitFlag == 0) ExitFlag = 1;1981 if ((argptr+4 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {1982 ExitFlag = 255;1983 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for translation: -t <x> <y> <z> --molecule-by-id <molecule_id> --periodic <0/1>" << endl);1984 performCriticalExit();1985 } else {1986 ArgcList.insert(argptr-1);1987 ArgcList.insert(argptr);1988 ArgcList.insert(argptr+1);1989 ArgcList.insert(argptr+2);1990 ArgcList.insert(argptr+3);1991 ArgcList.insert(argptr+4);1992 ArgcList.insert(argptr+5);1993 ArgcList.insert(argptr+6);1994 argptr+=7;1995 }1996 break;1997 case 's':1998 if (ExitFlag == 0) ExitFlag = 1;1999 if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {2000 ExitFlag = 255;2001 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for scaling: -s <factor_x> [factor_y] [factor_z]" << endl);2002 performCriticalExit();2003 } else {2004 ArgcList.insert(argptr-1);2005 ArgcList.insert(argptr);2006 ArgcList.insert(argptr+1);2007 ArgcList.insert(argptr+2);2008 argptr+=3;2009 }2010 break;2011 case 'b':2012 if (ExitFlag == 0) ExitFlag = 1;2013 if ((argptr+5 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) {2014 ExitFlag = 255;2015 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for centering in box: -b <xx> <xy> <xz> <yy> <yz> <zz>" << endl);2016 performCriticalExit();2017 } else {2018 ArgcList.insert(argptr-1);2019 ArgcList.insert(argptr);2020 ArgcList.insert(argptr+1);2021 ArgcList.insert(argptr+2);2022 ArgcList.insert(argptr+3);2023 ArgcList.insert(argptr+4);2024 ArgcList.insert(argptr+5);2025 argptr+=6;2026 }2027 break;2028 case 'B':2029 if (ExitFlag == 0) ExitFlag = 1;2030 if ((argptr+5 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) ) {2031 ExitFlag = 255;2032 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for bounding in box: -B <xx> <xy> <xz> <yy> <yz> <zz>" << endl);2033 performCriticalExit();2034 } else {2035 ArgcList.insert(argptr-1);2036 ArgcList.insert(argptr);2037 ArgcList.insert(argptr+1);2038 ArgcList.insert(argptr+2);2039 ArgcList.insert(argptr+3);2040 ArgcList.insert(argptr+4);2041 ArgcList.insert(argptr+5);2042 argptr+=6;2043 }2044 break;2045 case 'c':2046 if (ExitFlag == 0) ExitFlag = 1;2047 if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {2048 ExitFlag = 255;2049 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for centering with boundary: -c <boundary_x> <boundary_y> <boundary_z>" << endl);2050 performCriticalExit();2051 } else {2052 ArgcList.insert(argptr-1);2053 ArgcList.insert(argptr);2054 ArgcList.insert(argptr+1);2055 ArgcList.insert(argptr+2);2056 argptr+=3;2057 }2058 break;2059 case 'O':2060 if (ExitFlag == 0) ExitFlag = 1;2061 ArgcList.insert(argptr-1);2062 argptr+=0;2063 break;2064 case 'r':2065 if (ExitFlag == 0) ExitFlag = 1;2066 if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr]))) {2067 ExitFlag = 255;2068 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -r <id>" << endl);2069 performCriticalExit();2070 } else {2071 ArgcList.insert(argptr-1);2072 ArgcList.insert(argptr);2073 argptr+=1;2074 }2075 break;2076 case 'f':2077 if (ExitFlag == 0) ExitFlag = 1;2078 if ((argptr+1 >= argc) || (argv[argptr][0] == '-')) {2079 ExitFlag = 255;2080 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for fragmentation: -f <max. bond distance> <bond order>" << endl);2081 performCriticalExit();2082 } else {2083 ArgcList.insert(argptr-1);2084 ArgcList.insert(argptr);2085 ArgcList.insert(argptr+1);2086 ArgcList.insert(argptr+2);2087 ArgcList.insert(argptr+3);2088 ArgcList.insert(argptr+4);2089 argptr+=5;2090 }2091 break;2092 case 'm':2093 if (ExitFlag == 0) ExitFlag = 1;2094 j = atoi(argv[argptr++]);2095 if ((j<0) || (j>1)) {2096 DoeLog(1) && (eLog()<< Verbose(1) << "Argument of '-m' should be either 0 for no-rotate or 1 for rotate." << endl);2097 j = 0;2098 }2099 if (j) {2100 SaveFlag = true;2101 DoLog(0) && (Log() << Verbose(0) << "Converting to prinicipal axis system." << endl);2102 mol->PrincipalAxisSystem((bool)j);2103 } else2104 ArgcList.insert(argptr-1);2105 argptr+=0;2106 break;2107 case 'o':2108 if (ExitFlag == 0) ExitFlag = 1;2109 if ((argptr+4 >= argc) || (argv[argptr][0] == '-')){2110 ExitFlag = 255;2111 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for convex envelope: -o <molecule_id> --output-file <output file> --output-file <binned output file>" << endl);2112 performCriticalExit();2113 } else {2114 ArgcList.insert(argptr-1);2115 ArgcList.insert(argptr);2116 ArgcList.insert(argptr+1);2117 ArgcList.insert(argptr+2);2118 ArgcList.insert(argptr+3);2119 ArgcList.insert(argptr+4);2120 argptr+=5;2121 }2122 break;2123 case 'U':2124 if (ExitFlag == 0) ExitFlag = 1;2125 if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) ) {2126 ExitFlag = 255;2127 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for suspension with specified volume: -U <volume> <density>" << endl);2128 performCriticalExit();2129 } else {2130 volume = atof(argv[argptr++]);2131 DoLog(0) && (Log() << Verbose(0) << "Using " << volume << " angstrom^3 as the volume instead of convex envelope one's." << endl);2132 }2133 case 'u':2134 if (ExitFlag == 0) ExitFlag = 1;2135 if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) ) {2136 if (volume != -1)2137 ExitFlag = 255;2138 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for suspension: -u <density>" << endl);2139 performCriticalExit();2140 } else {2141 ArgcList.insert(argptr-1);2142 ArgcList.insert(argptr);2143 argptr+=1;2144 }2145 break;2146 case 'd':2147 if (ExitFlag == 0) ExitFlag = 1;2148 if ((argptr+2 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {2149 ExitFlag = 255;2150 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for repeating cells: -d <repeat_x> <repeat_y> <repeat_z>" << endl);2151 performCriticalExit();2152 } else {2153 ArgcList.insert(argptr-1);2154 ArgcList.insert(argptr);2155 ArgcList.insert(argptr+1);2156 ArgcList.insert(argptr+2);2157 argptr+=3;2158 }2159 break;2160 default: // no match? Step on2161 if ((argptr < argc) && (argv[argptr][0] != '-')) // if it started with a '-' we've already made a step!2162 argptr++;2163 break;2164 }2165 }2166 } else argptr++;2167 } while (argptr < argc);2168 if (SaveFlag)2169 configuration.SaveAll(*ConfigFileName, periode, molecules);2170 } else { // no arguments, hence scan the elements db2171 if (periode->LoadPeriodentafel(configuration.databasepath))2172 DoLog(0) && (Log() << Verbose(0) << "Element list loaded successfully." << endl);2173 else2174 DoLog(0) && (Log() << Verbose(0) << "Element list loading failed." << endl);2175 configuration.RetrieveConfigPathAndName("main_pcp_linux");2176 }2177 return(ExitFlag);2178 };2179 80 2180 81 /********************************************** Main routine **************************************/ 2181 82 2182 83 void cleanUp(){ 84 FormatParserStorage::purgeInstance(); 85 ChangeTracker::purgeInstance(); 2183 86 World::purgeInstance(); 2184 87 logger::purgeInstance(); … … 2197 100 int main(int argc, char **argv) 2198 101 { 2199 2200 2201 Vector x, y, z, n;2202 ifstream test;2203 ofstream output;2204 string line;2205 char **Arguments = NULL;2206 int ArgcSize = 0;2207 int ExitFlag = 0;2208 bool ArgumentsCopied = false;2209 char *ConfigFileName = new char[MAXSTRINGSIZE];102 // while we are non interactive, we want to abort from asserts 103 //ASSERT_DO(Assert::Abort); 104 string line; 105 char **Arguments = NULL; 106 int ArgcSize = 0; 107 int ExitFlag = 0; 108 bool ArgumentsCopied = false; 109 std::string BondGraphFileName("\n"); 110 FormatParserStorage::getInstance().addMpqc(); 111 FormatParserStorage::getInstance().addPcp(); 112 FormatParserStorage::getInstance().addXyz(); 2210 113 2211 // print version check whether arguments are present at all 2212 cout << ESPACKVersion << endl; 2213 if (argc < 2) { 2214 cout << "Obtain help with " << argv[0] << " -h." << endl; 2215 cleanUp(); 2216 Memory::getState(); 2217 return(1); 114 // print version check whether arguments are present at all 115 cout << ESPACKVersion << endl; 116 117 setVerbosity(0); 118 // need to init the history before any action is created 119 ActionHistory::init(); 120 121 // In the interactive mode, we can leave the user the choice in case of error 122 ASSERT_DO(Assert::Ask); 123 124 // from this moment on, we need to be sure to deeinitialize in the correct order 125 // this is handled by the cleanup function 126 atexit(cleanUp); 127 128 // Parse command line options and if present create respective UI 129 { 130 // construct bond graph 131 if (World::getInstance().getConfig()->BG == NULL) { 132 World::getInstance().getConfig()->BG = new BondGraph(World::getInstance().getConfig()->GetIsAngstroem()); 133 if (World::getInstance().getConfig()->BG->LoadBondLengthTable(BondGraphFileName)) { 134 DoLog(0) && (Log() << Verbose(0) << "Bond length table loaded successfully." << endl); 135 } else { 136 DoeLog(1) && (eLog()<< Verbose(1) << "Bond length table loading failed." << endl); 137 } 2218 138 } 2219 2220 2221 setVerbosity(0); 2222 // need to init the history before any action is created 2223 ActionHistory::init(); 2224 2225 // In the interactive mode, we can leave the user the choice in case of error 2226 ASSERT_DO(Assert::Ask); 2227 2228 // from this moment on, we need to be sure to deeinitialize in the correct order 2229 // this is handled by the cleanup function 2230 atexit(cleanUp); 2231 2232 // Parse command line options and if present create respective UI 2233 { 2234 set<int> ArgcList; 2235 ArgcList.insert(0); // push back program! 2236 ArgcList.insert(1); // push back config file name 2237 // handle arguments by ParseCommandLineOptions() 2238 ExitFlag = ParseCommandLineOptions(argc,argv,World::getInstance().getMolecules(),World::getInstance().getPeriode(),*World::getInstance().getConfig(), &ConfigFileName, ArgcList); 2239 World::getInstance().setExitFlag(ExitFlag); 2240 // copy all remaining arguments to a new argv 2241 Arguments = new char *[ArgcList.size()]; 2242 cout << "The following arguments are handled by CommandLineParser: "; 2243 for (set<int>::iterator ArgcRunner = ArgcList.begin(); ArgcRunner != ArgcList.end(); ++ArgcRunner) { 2244 Arguments[ArgcSize] = new char[strlen(argv[*ArgcRunner])+2]; 2245 strcpy(Arguments[ArgcSize], argv[*ArgcRunner]); 2246 cout << " " << argv[*ArgcRunner]; 2247 ArgcSize++; 2248 } 2249 cout << endl; 2250 ArgumentsCopied = true; 2251 // handle remaining arguments by CommandLineParser 139 // handle remaining arguments by CommandLineParser 140 if (argc>1) { 2252 141 MapOfActions::getInstance().AddOptionsToParser(); 2253 142 map <std::string, std::string> ShortFormToActionMap = MapOfActions::getInstance().getShortFormToActionMap(); 2254 CommandLineParser::getInstance().Run(ArgcSize,Arguments, ShortFormToActionMap); 2255 if (!CommandLineParser::getInstance().isEmpty()) { 2256 DoLog(0) && (Log() << Verbose(0) << "Setting UI to CommandLine." << endl); 2257 UIFactory::registerFactory(new CommandLineUIFactory::description()); 2258 UIFactory::makeUserInterface("CommandLine"); 2259 } else { 2260 DoLog(0) && (Log() << Verbose(0) << "Setting UI to Text." << endl); 2261 UIFactory::registerFactory(new TextUIFactory::description()); 2262 UIFactory::makeUserInterface("Text"); 2263 } 143 CommandLineParser::getInstance().Run(argc,argv, ShortFormToActionMap); 144 DoLog(0) && (Log() << Verbose(0) << "Setting UI to CommandLine." << endl); 145 UIFactory::registerFactory(new CommandLineUIFactory::description()); 146 UIFactory::makeUserInterface("CommandLine"); 147 } else { 148 DoLog(0) && (Log() << Verbose(0) << "Setting UI to Text." << endl); 149 UIFactory::registerFactory(new TextUIFactory::description()); 150 UIFactory::makeUserInterface("Text"); 2264 151 } 152 } 2265 153 2266 2267 2268 2269 2270 154 { 155 MainWindow *mainWindow = UIFactory::getInstance().makeMainWindow(); 156 mainWindow->display(); 157 delete mainWindow; 158 } 2271 159 2272 Log() << Verbose(0) << "Saving to " << ConfigFileName << "." << endl;2273 World::getInstance().getConfig()->SaveAll(ConfigFileName, World::getInstance().getPeriode(), World::getInstance().getMolecules());160 FormatParserStorage::getInstance().SaveAll(); 161 ChangeTracker::getInstance().saveStatus(); 2274 162 2275 163 // free the new argv … … 2279 167 delete[](Arguments); 2280 168 } 2281 delete[](ConfigFileName);169 //delete[](ConfigFileName); 2282 170 2283 171 ExitFlag = World::getInstance().getExitFlag(); -
src/config.cpp
r0d5dce r8f822c 10 10 #include <cstring> 11 11 12 #include "World.hpp"13 12 #include "atom.hpp" 14 13 #include "bond.hpp" 14 #include "bondgraph.hpp" 15 15 #include "config.hpp" 16 #include "ConfigFileBuffer.hpp" 16 17 #include "element.hpp" 17 18 #include "helpers.hpp" … … 23 24 #include "molecule.hpp" 24 25 #include "periodentafel.hpp" 26 #include "ThermoStatContainer.hpp" 25 27 #include "World.hpp" 26 27 /******************************** Functions for class ConfigFileBuffer **********************/ 28 29 /** Structure containing compare function for Ion_Type sorting. 30 */ 31 struct IonTypeCompare { 32 bool operator()(const char* s1, const char *s2) const { 33 char number1[8]; 34 char number2[8]; 35 const char *dummy1, *dummy2; 36 //Log() << Verbose(0) << s1 << " " << s2 << endl; 37 dummy1 = strchr(s1, '_')+sizeof(char)*5; // go just after "Ion_Type" 38 dummy2 = strchr(dummy1, '_'); 39 strncpy(number1, dummy1, dummy2-dummy1); // copy the number 40 number1[dummy2-dummy1]='\0'; 41 dummy1 = strchr(s2, '_')+sizeof(char)*5; // go just after "Ion_Type" 42 dummy2 = strchr(dummy1, '_'); 43 strncpy(number2, dummy1, dummy2-dummy1); // copy the number 44 number2[dummy2-dummy1]='\0'; 45 if (atoi(number1) != atoi(number2)) 46 return (atoi(number1) < atoi(number2)); 47 else { 48 dummy1 = strchr(s1, '_')+sizeof(char); 49 dummy1 = strchr(dummy1, '_')+sizeof(char); 50 dummy2 = strchr(dummy1, ' ') < strchr(dummy1, '\t') ? strchr(dummy1, ' ') : strchr(dummy1, '\t'); 51 strncpy(number1, dummy1, dummy2-dummy1); // copy the number 52 number1[dummy2-dummy1]='\0'; 53 dummy1 = strchr(s2, '_')+sizeof(char); 54 dummy1 = strchr(dummy1, '_')+sizeof(char); 55 dummy2 = strchr(dummy1, ' ') < strchr(dummy1, '\t') ? strchr(dummy1, ' ') : strchr(dummy1, '\t'); 56 strncpy(number2, dummy1, dummy2-dummy1); // copy the number 57 number2[dummy2-dummy1]='\0'; 58 return (atoi(number1) < atoi(number2)); 59 } 60 } 61 }; 62 63 /** Constructor for ConfigFileBuffer class. 64 */ 65 ConfigFileBuffer::ConfigFileBuffer() : buffer(NULL), LineMapping(NULL), CurrentLine(0), NoLines(0) 66 { 67 }; 68 69 /** Constructor for ConfigFileBuffer class with filename to be parsed. 70 * \param *filename file name 71 */ 72 ConfigFileBuffer::ConfigFileBuffer(const char * const filename) : buffer(NULL), LineMapping(NULL), CurrentLine(0), NoLines(0) 73 { 74 ifstream *file = NULL; 75 char line[MAXSTRINGSIZE]; 76 77 // prescan number of lines 78 file= new ifstream(filename); 79 if (file == NULL) { 80 DoeLog(1) && (eLog()<< Verbose(1) << "config file " << filename << " missing!" << endl); 81 return; 82 } 83 NoLines = 0; // we're overcounting by one 84 long file_position = file->tellg(); // mark current position 85 do { 86 file->getline(line, 256); 87 NoLines++; 88 } while (!file->eof()); 89 file->clear(); 90 file->seekg(file_position, ios::beg); 91 DoLog(1) && (Log() << Verbose(1) << NoLines-1 << " lines were recognized." << endl); 92 93 // allocate buffer's 1st dimension 94 if (buffer != NULL) { 95 DoeLog(1) && (eLog()<< Verbose(1) << "FileBuffer->buffer is not NULL!" << endl); 96 return; 97 } else 98 buffer = new char *[NoLines]; 99 100 // scan each line and put into buffer 101 int lines=0; 102 int i; 103 do { 104 buffer[lines] = new char[MAXSTRINGSIZE]; 105 file->getline(buffer[lines], MAXSTRINGSIZE-1); 106 i = strlen(buffer[lines]); 107 buffer[lines][i] = '\n'; 108 buffer[lines][i+1] = '\0'; 109 lines++; 110 } while((!file->eof()) && (lines < NoLines)); 111 DoLog(1) && (Log() << Verbose(1) << lines-1 << " lines were read into the buffer." << endl); 112 113 // close and exit 114 file->close(); 115 file->clear(); 116 delete(file); 117 } 118 119 /** Destructor for ConfigFileBuffer class. 120 */ 121 ConfigFileBuffer::~ConfigFileBuffer() 122 { 123 for(int i=0;i<NoLines;++i) 124 delete[](buffer[i]); 125 delete[](buffer); 126 delete[](LineMapping); 127 } 128 129 130 /** Create trivial mapping. 131 */ 132 void ConfigFileBuffer::InitMapping() 133 { 134 LineMapping = new int[NoLines]; 135 for (int i=0;i<NoLines;i++) 136 LineMapping[i] = i; 137 } 138 139 /** Creates a mapping for the \a *FileBuffer's lines containing the Ion_Type keyword such that they are sorted. 140 * \a *map on return contains a list of NoAtom entries such that going through the list, yields indices to the 141 * lines in \a *FileBuffer in a sorted manner of the Ion_Type?_? keywords. We assume that ConfigFileBuffer::CurrentLine 142 * points to first Ion_Type entry. 143 * \param *FileBuffer pointer to buffer structure 144 * \param NoAtoms of subsequent lines to look at 145 */ 146 void ConfigFileBuffer::MapIonTypesInBuffer(const int NoAtoms) 147 { 148 map<const char *, int, IonTypeCompare> IonTypeLineMap; 149 if (LineMapping == NULL) { 150 DoeLog(0) && (eLog()<< Verbose(0) << "map pointer is NULL: " << LineMapping << endl); 151 performCriticalExit(); 152 return; 153 } 154 155 // put all into hashed map 156 for (int i=0; i<NoAtoms; ++i) { 157 IonTypeLineMap.insert(pair<const char *, int> (buffer[CurrentLine+i], CurrentLine+i)); 158 } 159 160 // fill map 161 int nr=0; 162 for (map<const char *, int, IonTypeCompare>::iterator runner = IonTypeLineMap.begin(); runner != IonTypeLineMap.end(); ++runner) { 163 if (CurrentLine+nr < NoLines) 164 LineMapping[CurrentLine+(nr++)] = runner->second; 165 else { 166 DoeLog(0) && (eLog()<< Verbose(0) << "config::MapIonTypesInBuffer - NoAtoms is wrong: We are past the end of the file!" << endl); 167 performCriticalExit(); 168 } 169 } 170 } 28 #include "Matrix.hpp" 29 #include "Box.hpp" 171 30 172 31 /************************************* Functions for class config ***************************/ … … 174 33 /** Constructor for config file class. 175 34 */ 176 config::config() : BG(NULL), PsiType(0), MaxPsiDouble(0), PsiMaxNoUp(0), PsiMaxNoDown(0), MaxMinStopStep(1), InitMaxMinStopStep(1), ProcPEGamma(8), ProcPEPsi(1), configpath(NULL), 177 configname(NULL), FastParsing(false), Deltat(0.01), basis(""), databasepath(NULL), DoConstrainedMD(0), MaxOuterStep(0), Thermostat(4), ThermostatImplemented(NULL), 178 ThermostatNames(NULL), TempFrequency(2.5), alpha(0.), HooverMass(0.), TargetTemp(0.00095004455), ScaleTempStep(25), mainname(NULL), defaultpath(NULL), pseudopotpath(NULL), 35 config::config() : BG(NULL), Thermostats(0), PsiType(0), MaxPsiDouble(0), PsiMaxNoUp(0), PsiMaxNoDown(0), MaxMinStopStep(1), InitMaxMinStopStep(1), ProcPEGamma(8), ProcPEPsi(1), 36 configname(NULL), FastParsing(false), Deltat(0.01), basis(""), databasepath(NULL), DoConstrainedMD(0), MaxOuterStep(0), mainname(NULL), defaultpath(NULL), pseudopotpath(NULL), 179 37 DoOutVis(0), DoOutMes(1), DoOutNICS(0), DoOutOrbitals(0), DoOutCurrent(0), DoFullCurrent(0), DoPerturbation(0), DoWannier(0), CommonWannier(0), SawtoothStart(0.01), 180 38 VectorPlane(0), VectorCut(0.), UseAddGramSch(1), Seed(1), OutVisStep(10), OutSrcStep(5), MaxPsiStep(0), EpsWannier(1e-7), MaxMinStep(100), RelEpsTotalEnergy(1e-7), … … 186 44 pseudopotpath = new char[MAXSTRINGSIZE]; 187 45 databasepath = new char[MAXSTRINGSIZE]; 188 configpath = new char[MAXSTRINGSIZE];189 46 configname = new char[MAXSTRINGSIZE]; 47 Thermostats = new ThermoStatContainer(); 190 48 strcpy(mainname,"pcp"); 191 49 strcpy(defaultpath,"not specified"); 192 50 strcpy(pseudopotpath,"not specified"); 193 configpath[0]='\0';194 51 configname[0]='\0'; 195 52 basis = "3-21G"; 196 197 InitThermostats();198 53 }; 199 54 … … 206 61 delete[](pseudopotpath); 207 62 delete[](databasepath); 208 delete[](configpath);209 63 delete[](configname); 210 delete[](ThermostatImplemented); 211 for (int j=0;j<MaxThermostats;j++) 212 delete[](ThermostatNames[j]); 213 delete[](ThermostatNames); 64 if (Thermostats != NULL) 65 delete(Thermostats); 214 66 215 67 if (BG != NULL) 216 68 delete(BG); 217 69 }; 218 219 /** Initialises variables in class config for Thermostats.220 */221 void config::InitThermostats()222 {223 ThermostatImplemented = new int[MaxThermostats];224 ThermostatNames = new char *[MaxThermostats];225 for (int j=0;j<MaxThermostats;j++)226 ThermostatNames[j] = new char[12];227 228 strcpy(ThermostatNames[0],"None");229 ThermostatImplemented[0] = 1;230 strcpy(ThermostatNames[1],"Woodcock");231 ThermostatImplemented[1] = 1;232 strcpy(ThermostatNames[2],"Gaussian");233 ThermostatImplemented[2] = 1;234 strcpy(ThermostatNames[3],"Langevin");235 ThermostatImplemented[3] = 1;236 strcpy(ThermostatNames[4],"Berendsen");237 ThermostatImplemented[4] = 1;238 strcpy(ThermostatNames[5],"NoseHoover");239 ThermostatImplemented[5] = 1;240 };241 242 /** Readin of Thermostat related values from parameter file.243 * \param *fb file buffer containing the config file244 */245 void config::ParseThermostats(class ConfigFileBuffer * const fb)246 {247 char * const thermo = new char[12];248 const int verbose = 0;249 250 // read desired Thermostat from file along with needed additional parameters251 if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) {252 if (strcmp(thermo, ThermostatNames[0]) == 0) { // None253 if (ThermostatImplemented[0] == 1) {254 Thermostat = None;255 } else {256 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);257 Thermostat = None;258 }259 } else if (strcmp(thermo, ThermostatNames[1]) == 0) { // Woodcock260 if (ThermostatImplemented[1] == 1) {261 Thermostat = Woodcock;262 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read scaling frequency263 } else {264 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);265 Thermostat = None;266 }267 } else if (strcmp(thermo, ThermostatNames[2]) == 0) { // Gaussian268 if (ThermostatImplemented[2] == 1) {269 Thermostat = Gaussian;270 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &ScaleTempStep, 1, critical); // read collision rate271 } else {272 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);273 Thermostat = None;274 }275 } else if (strcmp(thermo, ThermostatNames[3]) == 0) { // Langevin276 if (ThermostatImplemented[3] == 1) {277 Thermostat = Langevin;278 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read gamma279 if (ParseForParameter(verbose,fb,"Thermostat", 0, 3, 1, double_type, &alpha, 1, optional)) {280 DoLog(2) && (Log() << Verbose(2) << "Extended Stochastic Thermostat detected with interpolation coefficient " << alpha << "." << endl);281 } else {282 alpha = 1.;283 }284 } else {285 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);286 Thermostat = None;287 }288 } else if (strcmp(thermo, ThermostatNames[4]) == 0) { // Berendsen289 if (ThermostatImplemented[4] == 1) {290 Thermostat = Berendsen;291 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &TempFrequency, 1, critical); // read \tau_T292 } else {293 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);294 Thermostat = None;295 }296 } else if (strcmp(thermo, ThermostatNames[5]) == 0) { // Nose-Hoover297 if (ThermostatImplemented[5] == 1) {298 Thermostat = NoseHoover;299 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &HooverMass, 1, critical); // read Hoovermass300 alpha = 0.;301 } else {302 DoLog(1) && (Log() << Verbose(1) << "Warning: " << ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl);303 Thermostat = None;304 }305 } else {306 DoLog(1) && (Log() << Verbose(1) << " Warning: thermostat name was not understood!" << endl);307 Thermostat = None;308 }309 } else {310 if ((MaxOuterStep > 0) && (TargetTemp != 0))311 DoLog(2) && (Log() << Verbose(2) << "No thermostat chosen despite finite temperature MD, falling back to None." << endl);312 Thermostat = None;313 }314 delete[](thermo);315 };316 317 70 318 71 /** Displays menu for editing each entry of the config file. … … 629 382 }; 630 383 631 /** Retrieves the path in the given config file name.632 * \param filename config file string633 */634 void config::RetrieveConfigPathAndName(const string filename)635 {636 char *ptr = NULL;637 char *buffer = new char[MAXSTRINGSIZE];638 strncpy(buffer, filename.c_str(), MAXSTRINGSIZE);639 int last = -1;640 for(last=MAXSTRINGSIZE;last--;) {641 if (buffer[last] == '/')642 break;643 }644 if (last == -1) { // no path in front, set to local directory.645 strcpy(configpath, "./");646 ptr = buffer;647 } else {648 strncpy(configpath, buffer, last+1);649 ptr = &buffer[last+1];650 if (last < 254)651 configpath[last+1]='\0';652 }653 strcpy(configname, ptr);654 DoLog(0) && (Log() << Verbose(0) << "Found configpath: " << configpath << ", dir slash was found at " << last << ", config name is " << configname << "." << endl);655 delete[](buffer);656 };657 658 /** Initializes ConfigFileBuffer from a file.659 * \param *file input file stream being the opened config file660 * \param *FileBuffer pointer to FileBuffer on return, should point to NULL661 */662 void PrepareFileBuffer(const char * const filename, struct ConfigFileBuffer *&FileBuffer)663 {664 if (FileBuffer != NULL) {665 DoeLog(2) && (eLog()<< Verbose(2) << "deleting present FileBuffer in PrepareFileBuffer()." << endl);666 delete(FileBuffer);667 }668 FileBuffer = new ConfigFileBuffer(filename);669 670 FileBuffer->InitMapping();671 };672 673 384 /** Loads a molecule from a ConfigFileBuffer. 674 385 * \param *mol molecule to load … … 864 575 file->close(); 865 576 delete(file); 866 RetrieveConfigPathAndName(filename);867 577 868 578 // ParseParameterFile 869 struct ConfigFileBuffer *FileBuffer = NULL; 870 PrepareFileBuffer(filename,FileBuffer); 579 class ConfigFileBuffer *FileBuffer = new ConfigFileBuffer(filename); 871 580 872 581 /* Oeffne Hauptparameterdatei */ … … 877 586 int verbose = 0; 878 587 588 //TODO: This is actually sensible?: if (MaxOuterStep > 0) 879 589 ParseThermostats(FileBuffer); 880 590 … … 941 651 ParseForParameter(verbose,FileBuffer,"OutVisStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 942 652 ParseForParameter(verbose,FileBuffer,"OutSrcStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional); 943 ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &( config::TargetTemp), 1, optional);653 ParseForParameter(verbose,FileBuffer,"TargetTemp", 0, 1, 1, double_type, &(Thermostats->TargetTemp), 1, optional); 944 654 //ParseForParameter(verbose,FileBuffer,"Thermostat", 0, 1, 1, int_type, &(config::ScaleTempStep), 1, optional); 945 655 if (!ParseForParameter(verbose,FileBuffer,"EpsWannier", 0, 1, 1, double_type, &(config::EpsWannier), 1, optional)) … … 971 681 // Unit cell and magnetic field 972 682 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 973 double * c onst cell_size = World::getInstance().getDomain();683 double * cell_size = new double[6]; 974 684 cell_size[0] = BoxLength[0]; 975 685 cell_size[1] = BoxLength[3]; … … 978 688 cell_size[4] = BoxLength[7]; 979 689 cell_size[5] = BoxLength[8]; 690 World::getInstance().setDomain(cell_size); 691 delete cell_size; 980 692 //if (1) fprintf(stderr,"\n"); 981 693 … … 1101 813 return; 1102 814 } 1103 RetrieveConfigPathAndName(filename);1104 815 // ParseParameters 1105 816 … … 1150 861 ParseForParameter(verbose,file,"VisOuterStep", 0, 1, 1, int_type, &(config::OutVisStep), 1, optional); 1151 862 ParseForParameter(verbose,file,"VisSrcOuterStep", 0, 1, 1, int_type, &(config::OutSrcStep), 1, optional); 1152 ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &( config::TargetTemp), 1, optional);1153 ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &( config::ScaleTempStep), 1, optional);863 ParseForParameter(verbose,file,"TargetTemp", 0, 1, 1, double_type, &(Thermostats->TargetTemp), 1, optional); 864 ParseForParameter(verbose,file,"ScaleTempStep", 0, 1, 1, int_type, &(Thermostats->ScaleTempStep), 1, optional); 1154 865 config::EpsWannier = 1e-8; 1155 866 … … 1176 887 1177 888 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 1178 double * c onst cell_size = World::getInstance().getDomain();889 double * cell_size = new double[6]; 1179 890 cell_size[0] = BoxLength[0]; 1180 891 cell_size[1] = BoxLength[3]; … … 1183 894 cell_size[4] = BoxLength[7]; 1184 895 cell_size[5] = BoxLength[8]; 896 World::getInstance().setDomain(cell_size); 897 delete[] cell_size; 1185 898 if (1) fprintf(stderr,"\n"); 1186 899 config::DoPerturbation = 0; … … 1320 1033 // bring MaxTypes up to date 1321 1034 mol->CountElements(); 1322 const double * const cell_size = World::getInstance().getDomain();1035 const Matrix &domain = World::getInstance().getDomain().getM(); 1323 1036 ofstream * const output = new ofstream(filename, ios::out); 1324 1037 if (output != NULL) { … … 1339 1052 *output << "DoFullCurrent\t" << config::DoFullCurrent << "\t# Do full perturbation" << endl; 1340 1053 *output << "DoConstrainedMD\t" << config::DoConstrainedMD << "\t# Do perform a constrained (>0, relating to current MD step) instead of unconstrained (0) MD" << endl; 1341 *output << "Thermostat\t" << Thermostat Names[Thermostat] << "\t";1342 switch(Thermostat ) {1054 *output << "Thermostat\t" << Thermostats->ThermostatNames[Thermostats->Thermostat] << "\t"; 1055 switch(Thermostats->Thermostat) { 1343 1056 default: 1344 1057 case None: 1345 1058 break; 1346 1059 case Woodcock: 1347 *output << ScaleTempStep;1060 *output << Thermostats->ScaleTempStep; 1348 1061 break; 1349 1062 case Gaussian: 1350 *output << ScaleTempStep;1063 *output << Thermostats->ScaleTempStep; 1351 1064 break; 1352 1065 case Langevin: 1353 *output << T empFrequency << "\t" <<alpha;1066 *output << Thermostats->TempFrequency << "\t" << Thermostats->alpha; 1354 1067 break; 1355 1068 case Berendsen: 1356 *output << T empFrequency;1069 *output << Thermostats->TempFrequency; 1357 1070 break; 1358 1071 case NoseHoover: 1359 *output << HooverMass;1072 *output << Thermostats->HooverMass; 1360 1073 break; 1361 1074 }; … … 1372 1085 *output << "OutVisStep\t" << config::OutVisStep << "\t# Output visual data every ...th step" << endl; 1373 1086 *output << "OutSrcStep\t" << config::OutSrcStep << "\t# Output \"restart\" data every ..th step" << endl; 1374 *output << "TargetTemp\t" << config::TargetTemp << "\t# Target temperature" << endl;1087 *output << "TargetTemp\t" << Thermostats->TargetTemp << "\t# Target temperature" << endl; 1375 1088 *output << "MaxPsiStep\t" << config::MaxPsiStep << "\t# number of Minimisation steps per state (0 - default)" << endl; 1376 1089 *output << "EpsWannier\t" << config::EpsWannier << "\t# tolerance value for spread minimisation of orbitals" << endl; … … 1391 1104 *output << endl; 1392 1105 *output << "BoxLength\t\t\t# (Length of a unit cell)" << endl; 1393 *output << cell_size[0]<< "\t" << endl;1394 *output << cell_size[1] << "\t" << cell_size[2]<< "\t" << endl;1395 *output << cell_size[3] << "\t" << cell_size[4] << "\t" << cell_size[5]<< "\t" << endl;1106 *output << domain.at(0,0) << "\t" << endl; 1107 *output << domain.at(1,0) << "\t" << domain.at(1,1) << "\t" << endl; 1108 *output << domain.at(2,0) << "\t" << domain.at(2,1) << "\t" << domain.at(2,2) << "\t" << endl; 1396 1109 // FIXME 1397 1110 *output << endl; … … 1483 1196 // output of atoms 1484 1197 AtomNo = 0; 1485 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );1198 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo ); 1486 1199 delete(center); 1487 1200 *output << "\t}" << endl; … … 1525 1238 // output of atoms 1526 1239 AtomNo = 0; 1527 mol->ActOnAllAtoms( &atom::OutputMPQCLine, output, (const Vector *)center, &AtomNo );1240 mol->ActOnAllAtoms( &atom::OutputMPQCLine, (ostream * const) output, (const Vector *)center, &AtomNo ); 1528 1241 delete(center); 1529 1242 *output << "\t}" << endl; … … 1786 1499 molecule *mol = NULL; 1787 1500 1788 if (!strcmp(configpath, GetDefaultPath())) {1789 eLog() << Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl;1790 }1791 1792 1793 1501 // first save as PDB data 1794 1502 if (ConfigFileName != NULL) … … 1827 1535 mol->doCountAtoms(); 1828 1536 mol->CountElements(); 1829 mol->CalculateOrbitals(*this);1537 //mol->CalculateOrbitals(*this); 1830 1538 delete[](src); 1831 1539 } else { … … 1833 1541 mol = *(molecules->ListOfMolecules.begin()); 1834 1542 mol->doCountAtoms(); 1835 mol->CalculateOrbitals(*this);1543 //mol->CalculateOrbitals(*this); 1836 1544 } else { 1837 1545 DoeLog(1) && (eLog() << Verbose(1) << "There are no molecules to save!" << endl); … … 1895 1603 else 1896 1604 Log() << Verbose(0) << "\t... failed." << endl; 1897 1898 if (!strcmp(configpath, GetDefaultPath())) {1899 eLog() << Verbose(2) << "config is found under different path then stated in config file::defaultpath!" << endl;1900 }1901 1605 1902 1606 // don't destroy molecule as it contains all our atoms … … 2346 2050 return (found); // true if found, false if not 2347 2051 } 2052 2053 /** Reading of Thermostat related values from parameter file. 2054 * \param *fb file buffer containing the config file 2055 */ 2056 void config::ParseThermostats(class ConfigFileBuffer * const fb) 2057 { 2058 char * const thermo = new char[12]; 2059 const int verbose = 0; 2060 2061 // read desired Thermostat from file along with needed additional parameters 2062 if (ParseForParameter(verbose,fb,"Thermostat", 0, 1, 1, string_type, thermo, 1, optional)) { 2063 if (strcmp(thermo, Thermostats->ThermostatNames[0]) == 0) { // None 2064 if (Thermostats->ThermostatImplemented[0] == 1) { 2065 Thermostats->Thermostat = None; 2066 } else { 2067 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2068 Thermostats->Thermostat = None; 2069 } 2070 } else if (strcmp(thermo, Thermostats->ThermostatNames[1]) == 0) { // Woodcock 2071 if (Thermostats->ThermostatImplemented[1] == 1) { 2072 Thermostats->Thermostat = Woodcock; 2073 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &Thermostats->ScaleTempStep, 1, critical); // read scaling frequency 2074 } else { 2075 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2076 Thermostats->Thermostat = None; 2077 } 2078 } else if (strcmp(thermo, Thermostats->ThermostatNames[2]) == 0) { // Gaussian 2079 if (Thermostats->ThermostatImplemented[2] == 1) { 2080 Thermostats->Thermostat = Gaussian; 2081 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, int_type, &Thermostats->ScaleTempStep, 1, critical); // read collision rate 2082 } else { 2083 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2084 Thermostats->Thermostat = None; 2085 } 2086 } else if (strcmp(thermo, Thermostats->ThermostatNames[3]) == 0) { // Langevin 2087 if (Thermostats->ThermostatImplemented[3] == 1) { 2088 Thermostats->Thermostat = Langevin; 2089 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->TempFrequency, 1, critical); // read gamma 2090 if (ParseForParameter(verbose,fb,"Thermostat", 0, 3, 1, double_type, &Thermostats->alpha, 1, optional)) { 2091 DoLog(2) && (Log() << Verbose(2) << "Extended Stochastic Thermostat detected with interpolation coefficient " << Thermostats->alpha << "." << endl); 2092 } else { 2093 Thermostats->alpha = 1.; 2094 } 2095 } else { 2096 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2097 Thermostats->Thermostat = None; 2098 } 2099 } else if (strcmp(thermo, Thermostats->ThermostatNames[4]) == 0) { // Berendsen 2100 if (Thermostats->ThermostatImplemented[4] == 1) { 2101 Thermostats->Thermostat = Berendsen; 2102 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->TempFrequency, 1, critical); // read \tau_T 2103 } else { 2104 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2105 Thermostats->Thermostat = None; 2106 } 2107 } else if (strcmp(thermo, Thermostats->ThermostatNames[5]) == 0) { // Nose-Hoover 2108 if (Thermostats->ThermostatImplemented[5] == 1) { 2109 Thermostats->Thermostat = NoseHoover; 2110 ParseForParameter(verbose,fb,"Thermostat", 0, 2, 1, double_type, &Thermostats->HooverMass, 1, critical); // read Hoovermass 2111 Thermostats->alpha = 0.; 2112 } else { 2113 DoLog(1) && (Log() << Verbose(1) << "Warning: " << Thermostats->ThermostatNames[0] << " thermostat not implemented, falling back to None." << endl); 2114 Thermostats->Thermostat = None; 2115 } 2116 } else { 2117 DoLog(1) && (Log() << Verbose(1) << " Warning: thermostat name was not understood!" << endl); 2118 Thermostats->Thermostat = None; 2119 } 2120 } else { 2121 if ((Thermostats->TargetTemp != 0)) 2122 DoLog(2) && (Log() << Verbose(2) << "No thermostat chosen despite finite temperature MD, falling back to None." << endl); 2123 Thermostats->Thermostat = None; 2124 } 2125 delete[](thermo); 2126 }; 2127 -
src/config.hpp
r0d5dce r8f822c 20 20 #include <string> 21 21 22 #include "bondgraph.hpp"23 24 22 /****************************************** forward declarations *****************************/ 25 23 24 class BondGraph; 25 class ConfigFileBuffer; 26 26 class molecule; 27 27 class MoleculeListClass; 28 28 class periodentafel; 29 class ThermoStatContainer; 29 30 30 31 /********************************************** declarations *******************************/ 31 32 class ConfigFileBuffer {33 public:34 char **buffer;35 int *LineMapping;36 int CurrentLine;37 int NoLines;38 39 ConfigFileBuffer();40 ConfigFileBuffer(const char * const filename);41 ~ConfigFileBuffer();42 43 void InitMapping();44 void MapIonTypesInBuffer(const int NoAtoms);45 };46 32 47 33 /** The config file. … … 51 37 public: 52 38 class BondGraph *BG; 39 class ThermoStatContainer *Thermostats; 53 40 54 41 int PsiType; … … 60 47 int ProcPEGamma; 61 48 int ProcPEPsi; 62 char *configpath;63 49 char *configname; 64 50 bool FastParsing; … … 70 56 int DoConstrainedMD; 71 57 int MaxOuterStep; 72 int Thermostat;73 int *ThermostatImplemented;74 char **ThermostatNames;75 double TempFrequency;76 double alpha;77 double HooverMass;78 double TargetTemp;79 int ScaleTempStep;80 58 81 59 private: … … 138 116 void Load(const char * const filename, const string &BondGraphFileName, const periodentafel * const periode, MoleculeListClass * const &MolList); 139 117 void LoadOld(const char * const filename, const string &BondGraphFileName, const periodentafel * const periode, MoleculeListClass * const &MolList); 140 void RetrieveConfigPathAndName(const string filename);141 118 bool Save(const char * const filename, const periodentafel * const periode, molecule * const mol) const; 142 119 bool SaveMPQC(const char * const filename, const molecule * const mol) const; … … 152 129 char *GetDefaultPath() const; 153 130 void SetDefaultPath(const char * const path); 154 void InitThermostats();155 131 void ParseThermostats(class ConfigFileBuffer * const fb); 156 132 }; -
src/ellipsoid.cpp
r0d5dce r8f822c 21 21 #include "tesselation.hpp" 22 22 #include "vector.hpp" 23 #include "Matrix.hpp" 23 24 #include "verbose.hpp" 24 25 … … 34 35 Vector helper, RefPoint; 35 36 double distance = -1.; 36 double Matrix[NDIM*NDIM];37 Matrix Matrix; 37 38 double InverseLength[3]; 38 39 double psi,theta,phi; // euler angles in ZX'Z'' convention … … 51 52 theta = EllipsoidAngle[1]; 52 53 phi = EllipsoidAngle[2]; 53 Matrix [0] = cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi);54 Matrix [1] = -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi);55 Matrix [2] = sin(psi)*sin(theta);56 Matrix [3] = sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi);57 Matrix [4] = cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi);58 Matrix [5] = -cos(psi)*sin(theta);59 Matrix [6] = sin(theta)*sin(phi);60 Matrix [7] = sin(theta)*cos(phi);61 Matrix [8] = cos(theta);62 helper .MatrixMultiplication(Matrix);54 Matrix.set(0,0, cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi)); 55 Matrix.set(1,0, -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi)); 56 Matrix.set(2,0, sin(psi)*sin(theta)); 57 Matrix.set(0,1, sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi)); 58 Matrix.set(1,1, cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi)); 59 Matrix.set(2,1, -cos(psi)*sin(theta)); 60 Matrix.set(0,2, sin(theta)*sin(phi)); 61 Matrix.set(1,2, sin(theta)*cos(phi)); 62 Matrix.set(2,2, cos(theta)); 63 helper *= Matrix; 63 64 helper.ScaleAll(InverseLength); 64 65 //Log() << Verbose(4) << "Transformed RefPoint is at " << helper << "." << endl; … … 73 74 phi = -EllipsoidAngle[2]; 74 75 helper.ScaleAll(EllipsoidLength); 75 Matrix [0] = cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi);76 Matrix [1] = -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi);77 Matrix [2] = sin(psi)*sin(theta);78 Matrix [3] = sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi);79 Matrix [4] = cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi);80 Matrix [5] = -cos(psi)*sin(theta);81 Matrix [6] = sin(theta)*sin(phi);82 Matrix [7] = sin(theta)*cos(phi);83 Matrix [8] = cos(theta);84 helper .MatrixMultiplication(Matrix);76 Matrix.set(0,0, cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi)); 77 Matrix.set(1,0, -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi)); 78 Matrix.set(2,0, sin(psi)*sin(theta)); 79 Matrix.set(0,1, sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi)); 80 Matrix.set(1,1, cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi)); 81 Matrix.set(2,1, -cos(psi)*sin(theta)); 82 Matrix.set(0,2, sin(theta)*sin(phi)); 83 Matrix.set(1,2, sin(theta)*cos(phi)); 84 Matrix.set(2,2, cos(theta)); 85 helper *= Matrix; 85 86 //Log() << Verbose(4) << "Intersection is at " << helper << "." << endl; 86 87 -
src/helpers.cpp
r0d5dce r8f822c 117 117 }; 118 118 119 /** Blows the 6-dimensional \a cell_size array up to a full NDIM by NDIM matrix.120 * \param *symm 6-dim array of unique symmetric matrix components121 * \return allocated NDIM*NDIM array with the symmetric matrix122 */123 double * ReturnFullMatrixforSymmetric(const double * const symm)124 {125 double *matrix = new double[NDIM * NDIM];126 matrix[0] = symm[0];127 matrix[1] = symm[1];128 matrix[2] = symm[3];129 matrix[3] = symm[1];130 matrix[4] = symm[2];131 matrix[5] = symm[4];132 matrix[6] = symm[3];133 matrix[7] = symm[4];134 matrix[8] = symm[5];135 return matrix;136 };137 138 /** Calculate the inverse of a 3x3 matrix.139 * \param *matrix NDIM_NDIM array140 */141 double * InverseMatrix( const double * const A)142 {143 double *B = new double[NDIM * NDIM];144 double detA = RDET3(A);145 double detAReci;146 147 for (int i=0;i<NDIM*NDIM;++i)148 B[i] = 0.;149 // calculate the inverse B150 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular151 detAReci = 1./detA;152 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11153 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12154 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13155 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21156 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22157 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23158 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31159 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32160 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33161 }162 return B;163 };164 165 166 167 119 /** Comparison function for GSL heapsort on distances in two molecules. 168 120 * \param *a -
src/helpers.hpp
r0d5dce r8f822c 52 52 bool IsValidNumber( const char *string); 53 53 int CompareDoubles (const void * a, const void * b); 54 double * ReturnFullMatrixforSymmetric(const double * const cell_size);55 double * InverseMatrix(const double * const A);56 54 void performCriticalExit(); 57 55 -
src/molecule.cpp
r0d5dce r8f822c 9 9 #include <cstring> 10 10 #include <boost/bind.hpp> 11 #include <boost/foreach.hpp> 11 12 12 13 #include "World.hpp" … … 27 28 #include "tesselation.hpp" 28 29 #include "vector.hpp" 30 #include "Matrix.hpp" 29 31 #include "World.hpp" 32 #include "Box.hpp" 30 33 #include "Plane.hpp" 31 34 #include "Exceptions/LinearDependenceException.hpp" … … 79 82 void molecule::setName(const std::string _name){ 80 83 OBSERVE; 84 cout << "Set name of molecule " << getId() << " to " << _name << endl; 81 85 strncpy(name,_name.c_str(),MAXSTRINGSIZE); 82 86 } … … 154 158 molecule::const_iterator molecule::erase( atom * key ) 155 159 { 156 cout << "trying to erase atom" << endl;157 160 molecule::const_iterator iter = find(key); 158 161 if (iter != end()){ … … 284 287 Vector Orthovector1, Orthovector2; // temporary vectors in coordination construction 285 288 Vector InBondvector; // vector in direction of *Bond 286 double *matrix = NULL;289 const Matrix &matrix = World::getInstance().getDomain().getM(); 287 290 bond *Binder = NULL; 288 double * const cell_size = World::getInstance().getDomain();289 291 290 292 // Log() << Verbose(3) << "Begin of AddHydrogenReplacementAtom." << endl; … … 307 309 } // (signs are correct, was tested!) 308 310 } 309 matrix = ReturnFullMatrixforSymmetric(cell_size); 310 Orthovector1.MatrixMultiplication(matrix); 311 Orthovector1 *= matrix; 311 312 InBondvector -= Orthovector1; // subtract just the additional translation 312 delete[](matrix);313 313 bondlength = InBondvector.Norm(); 314 314 // Log() << Verbose(4) << "Corrected InBondvector is now: "; … … 541 541 break; 542 542 } 543 delete[](matrix);544 543 545 544 // Log() << Verbose(3) << "End of AddHydrogenReplacementAtom." << endl; … … 660 659 * @param three vectors forming the matrix that defines the shape of the parallelpiped 661 660 */ 662 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const {661 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const Matrix ¶llelepiped) const { 663 662 molecule *copy = World::getInstance().createMolecule(); 664 663 665 ActOnCopyWithEachAtomIfTrue ( &molecule::AddCopyAtom, copy, &atom::IsInParallelepiped, offset, parallelepiped ); 664 BOOST_FOREACH(atom *iter,atoms){ 665 if(iter->IsInParallelepiped(offset,parallelepiped)){ 666 copy->AddCopyAtom(iter); 667 } 668 } 666 669 667 670 //TODO: copy->BuildInducedSubgraph(this); … … 740 743 else 741 744 length = strlen(molname) - strlen(endname); 745 cout << "Set name of molecule " << getId() << " to " << molname << endl; 742 746 strncpy(name, molname, length); 743 747 name[length]='\0'; … … 749 753 void molecule::SetBoxDimension(Vector *dim) 750 754 { 751 double * const cell_size = World::getInstance().getDomain(); 752 cell_size[0] = dim->at(0); 753 cell_size[1] = 0.; 754 cell_size[2] = dim->at(1); 755 cell_size[3] = 0.; 756 cell_size[4] = 0.; 757 cell_size[5] = dim->at(2); 755 Matrix domain; 756 for(int i =0; i<NDIM;++i) 757 domain.at(i,i) = dim->at(i); 758 World::getInstance().setDomain(domain); 758 759 }; 759 760 … … 848 849 bool molecule::CheckBounds(const Vector *x) const 849 850 { 850 double * const cell_size = World::getInstance().getDomain();851 const Matrix &domain = World::getInstance().getDomain().getM(); 851 852 bool result = true; 852 int j =-1;853 853 for (int i=0;i<NDIM;i++) { 854 j += i+1; 855 result = result && ((x->at(i) >= 0) && (x->at(i) < cell_size[j])); 854 result = result && ((x->at(i) >= 0) && (x->at(i) < domain.at(i,i))); 856 855 } 857 856 //return result; … … 881 880 ElementNo[i] = current++; 882 881 } 883 ActOnAllAtoms( &atom::OutputArrayIndexed, output, (const int *)ElementNo, (int *)AtomNo, (const char *) NULL );882 ActOnAllAtoms( &atom::OutputArrayIndexed, (ostream * const) output, (const int *)ElementNo, (int *)AtomNo, (const char *) NULL ); 884 883 return true; 885 884 } … … 1004 1003 for(int i=MAX_ELEMENTS;i--;) 1005 1004 ElementCount += (ElementsInMolecule[i] != 0 ? 1 : 0); 1006 };1007 1008 1009 /** Counts necessary number of valence electrons and returns number and SpinType.1010 * \param configuration containing everything1011 */1012 void molecule::CalculateOrbitals(class config &configuration)1013 {1014 configuration.MaxPsiDouble = configuration.PsiMaxNoDown = configuration.PsiMaxNoUp = configuration.PsiType = 0;1015 for(int i=MAX_ELEMENTS;i--;) {1016 if (ElementsInMolecule[i] != 0) {1017 //Log() << Verbose(0) << "CalculateOrbitals: " << elemente->FindElement(i)->name << " has a valence of " << (int)elemente->FindElement(i)->Valence << " and there are " << ElementsInMolecule[i] << " of it." << endl;1018 configuration.MaxPsiDouble += ElementsInMolecule[i]*((int)elemente->FindElement(i)->Valence);1019 }1020 }1021 configuration.PsiMaxNoDown = configuration.MaxPsiDouble/2 + (configuration.MaxPsiDouble % 2);1022 configuration.PsiMaxNoUp = configuration.MaxPsiDouble/2;1023 configuration.MaxPsiDouble /= 2;1024 configuration.PsiType = (configuration.PsiMaxNoDown == configuration.PsiMaxNoUp) ? 0 : 1;1025 if ((configuration.PsiType == 1) && (configuration.ProcPEPsi < 2) && ((configuration.PsiMaxNoDown != 1) || (configuration.PsiMaxNoUp != 0))) {1026 configuration.ProcPEGamma /= 2;1027 configuration.ProcPEPsi *= 2;1028 } else {1029 configuration.ProcPEGamma *= configuration.ProcPEPsi;1030 configuration.ProcPEPsi = 1;1031 }1032 cout << configuration.PsiMaxNoDown << ">" << configuration.PsiMaxNoUp << endl;1033 if (configuration.PsiMaxNoDown > configuration.PsiMaxNoUp) {1034 configuration.InitMaxMinStopStep = configuration.MaxMinStopStep = configuration.PsiMaxNoDown;1035 cout << configuration.PsiMaxNoDown << " " << configuration.InitMaxMinStopStep << endl;1036 } else {1037 configuration.InitMaxMinStopStep = configuration.MaxMinStopStep = configuration.PsiMaxNoUp;1038 cout << configuration.PsiMaxNoUp << " " << configuration.InitMaxMinStopStep << endl;1039 }1040 1005 }; 1041 1006 -
src/molecule.hpp
r0d5dce r8f822c 80 80 double *PenaltyConstants; //!< penalty constant in front of each term 81 81 }; 82 83 #define MaxThermostats 6 //!< maximum number of thermostat entries in Ions#ThermostatNames and Ions#ThermostatImplemented84 enum thermostats { None, Woodcock, Gaussian, Langevin, Berendsen, NoseHoover }; //!< Thermostat names for output85 86 82 87 83 /** The complete molecule. … … 265 261 /// Count and change present atoms' coordination. 266 262 void CountElements(); 267 void CalculateOrbitals(class config &configuration);268 263 bool CenterInBox(); 269 264 bool BoundInBox(); … … 292 287 double MinimiseConstrainedPotential(atom **&permutation, int startstep, int endstep, bool IsAngstroem); 293 288 void EvaluateConstrainedForces(int startstep, int endstep, atom **PermutationMap, ForceMatrix *Force); 294 bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, const char *prefix, config &configuration, bool MapByIdentity);289 bool LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string &prefix, config &configuration, bool MapByIdentity); 295 290 296 291 bool CheckBounds(const Vector *x) const; … … 321 316 322 317 molecule *CopyMolecule(); 323 molecule* CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const;318 molecule* CopyMoleculeFromSubRegion(const Vector offset, const Matrix ¶llelepiped) const; 324 319 325 320 /// Fragment molecule by two different approaches: 326 int FragmentMolecule(int Order, config *configuration);327 bool CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, char *path = NULL);328 bool StoreBondsToFile( char *path, char *filename);329 bool StoreAdjacencyToFile( char *path, char *filename);330 bool CheckAdjacencyFileAgainstMolecule( char *path, atom **ListOfAtoms);331 bool ParseOrderAtSiteFromFile( char *path);332 bool StoreOrderAtSiteFile( char *path);333 bool StoreForcesFile(MoleculeListClass *BondFragments, char *path, int *SortIndex);321 int FragmentMolecule(int Order, std::string &prefix); 322 bool CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, std::string path = ""); 323 bool StoreBondsToFile(std::string &filename, std::string path = ""); 324 bool StoreAdjacencyToFile(std::string &filename, std::string path = ""); 325 bool CheckAdjacencyFileAgainstMolecule(std::string &path, atom **ListOfAtoms); 326 bool ParseOrderAtSiteFromFile(std::string &path); 327 bool StoreOrderAtSiteFile(std::string &path); 328 bool StoreForcesFile(MoleculeListClass *BondFragments, std::string &path, int *SortIndex); 334 329 bool CreateMappingLabelsToConfigSequence(int *&SortIndex); 335 330 bool CreateFatherLookupTable(atom **&LookupTable, int count = 0); … … 380 375 ~MoleculeListClass(); 381 376 382 bool AddHydrogenCorrection( char *path);383 bool StoreForcesFile( char *path, int *SortIndex);377 bool AddHydrogenCorrection(std::string &path); 378 bool StoreForcesFile(std::string &path, int *SortIndex); 384 379 void insert(molecule *mol); 385 380 void erase(molecule *mol); 386 381 molecule * ReturnIndex(int index); 387 bool OutputConfigForListOfFragments( config *configuration, int *SortIndex);382 bool OutputConfigForListOfFragments(std::string &prefix, int *SortIndex); 388 383 int NumberOfActiveMolecules(); 389 384 void Enumerate(ostream *out); -
src/molecule_dynamics.cpp
r0d5dce r8f822c 18 18 #include "parser.hpp" 19 19 #include "Plane.hpp" 20 #include "ThermoStatContainer.hpp" 20 21 21 22 /************************************* Functions for class molecule *********************************/ … … 472 473 * \param startstep stating initial configuration in molecule::Trajectories 473 474 * \param endstep stating final configuration in molecule::Trajectories 475 * \param &prefix path and prefix 474 476 * \param &config configuration structure 475 477 * \param MapByIdentity if true we just use the identity to map atoms in start config to end config, if not we find mapping by \sa MinimiseConstrainedPotential() 476 478 * \return true - success in writing step files, false - error writing files or only one step in molecule::Trajectories 477 479 */ 478 bool molecule::LinearInterpolationBetweenConfiguration(int startstep, int endstep, const char *prefix, config &configuration, bool MapByIdentity)480 bool molecule::LinearInterpolationBetweenConfiguration(int startstep, int endstep, std::string &prefix, config &configuration, bool MapByIdentity) 479 481 { 480 482 molecule *mol = NULL; … … 524 526 for (int i=getAtomCount(); i--; ) 525 527 SortIndex[i] = i; 526 status = MoleculePerStep->OutputConfigForListOfFragments(&configuration, SortIndex); 528 529 status = MoleculePerStep->OutputConfigForListOfFragments(prefix, SortIndex); 527 530 delete[](SortIndex); 528 531 … … 643 646 644 647 // calculate scale configuration 645 ScaleTempFactor = configuration.T argetTemp/ActualTemp;648 ScaleTempFactor = configuration.Thermostats->TargetTemp/ActualTemp; 646 649 647 650 // differentating between the various thermostats … … 651 654 break; 652 655 case Woodcock: 653 if ((configuration. ScaleTempStep > 0) && ((MDSteps-1) % configuration.ScaleTempStep == 0)) {656 if ((configuration.Thermostats->ScaleTempStep > 0) && ((MDSteps-1) % configuration.Thermostats->ScaleTempStep == 0)) { 654 657 DoLog(2) && (Log() << Verbose(2) << "Applying Woodcock thermostat..." << endl); 655 658 ActOnAllAtoms( &atom::Thermostat_Woodcock, sqrt(ScaleTempFactor), MDSteps, &ekin ); … … 684 687 delta_alpha = 0.; 685 688 ActOnAllAtoms( &atom::Thermostat_NoseHoover_init, MDSteps, &delta_alpha ); 686 delta_alpha = (delta_alpha - (3.*getAtomCount()+1.) * configuration.T argetTemp)/(configuration.HooverMass*Units2Electronmass);687 configuration. alpha += delta_alpha*configuration.Deltat;688 DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << configuration.Deltat << " = " << configuration. alpha << "." << endl);689 delta_alpha = (delta_alpha - (3.*getAtomCount()+1.) * configuration.Thermostats->TargetTemp)/(configuration.Thermostats->HooverMass*Units2Electronmass); 690 configuration.Thermostats->alpha += delta_alpha*configuration.Deltat; 691 DoLog(3) && (Log() << Verbose(3) << "alpha = " << delta_alpha << " * " << configuration.Deltat << " = " << configuration.Thermostats->alpha << "." << endl); 689 692 // apply updated alpha as additional force 690 693 ActOnAllAtoms( &atom::Thermostat_NoseHoover_scale, MDSteps, &ekin, &configuration ); -
src/molecule_fragmentation.cpp
r0d5dce r8f822c 22 22 #include "periodentafel.hpp" 23 23 #include "World.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 24 26 25 27 /************************************* Functions for class molecule *********************************/ … … 82 84 * -# Scans TEFactors file and sets the TEFactor of each key set in the temporary graph accordingly 83 85 * Finally, the temporary graph is inserted into the given \a FragmentList for return. 84 * \param *out output stream for debugging 85 * \param *path path to file 86 * \param &path path to file 86 87 * \param *FragmentList empty, filled on return 87 88 * \return true - parsing successfully, false - failure on parsing (FragmentList will be NULL) 88 89 */ 89 bool ParseKeySetFile( char *path, Graph *&FragmentList)90 bool ParseKeySetFile(std::string &path, Graph *&FragmentList) 90 91 { 91 92 bool status = true; … … 94 95 GraphTestPair testGraphInsert; 95 96 int NumberOfFragments = 0; 96 char filename[MAXSTRINGSIZE];97 string filename; 97 98 98 99 if (FragmentList == NULL) { // check list pointer … … 102 103 // 1st pass: open file and read 103 104 DoLog(1) && (Log() << Verbose(1) << "Parsing the KeySet file ... " << endl); 104 sprintf(filename, "%s/%s%s", path, FRAGMENTPREFIX, KEYSETFILE);105 InputFile.open(filename );106 if (InputFile != NULL) {105 filename = path + KEYSETFILE; 106 InputFile.open(filename.c_str()); 107 if (InputFile.good()) { 107 108 // each line represents a new fragment 108 109 char buffer[MAXSTRINGSIZE]; … … 181 182 182 183 /** Stores key sets to file. 183 * \param *out output stream for debugging184 184 * \param KeySetList Graph with Keysets 185 * \param *path path to file185 * \param &path path to file 186 186 * \return true - file written successfully, false - writing failed 187 187 */ 188 bool StoreKeySetFile(Graph &KeySetList, char *path) 189 { 190 ofstream output; 188 bool StoreKeySetFile(Graph &KeySetList, std::string &path) 189 { 191 190 bool status = true; 192 string line; 191 string line = path + KEYSETFILE; 192 ofstream output(line.c_str()); 193 193 194 194 // open KeySet file 195 line = path;196 line.append("/");197 line += FRAGMENTPREFIX;198 line += KEYSETFILE;199 output.open(line.c_str(), ios::out);200 195 DoLog(1) && (Log() << Verbose(1) << "Saving key sets of the total graph ... "); 201 if(output != NULL) {196 if(output.good()) { 202 197 for(Graph::iterator runner = KeySetList.begin(); runner != KeySetList.end(); runner++) { 203 198 for (KeySet::iterator sprinter = (*runner).first.begin();sprinter != (*runner).first.end(); sprinter++) { … … 302 297 303 298 /** Scans the adaptive order file and insert (index, value) into map. 304 * \param *out output stream for debugging 305 * \param *path path to ENERGYPERFRAGMENT file (may be NULL if Order is non-negative) 299 * \param &path path to ENERGYPERFRAGMENT file (may be NULL if Order is non-negative) 306 300 * \param &IndexedKeySetList list to find key set for a given index \a No 307 301 * \return adaptive criteria list from file 308 302 */ 309 map<int, pair<double,int> > * ScanAdaptiveFileIntoMap( char *path, map<int,KeySet> &IndexKeySetList)303 map<int, pair<double,int> > * ScanAdaptiveFileIntoMap(std::string &path, map<int,KeySet> &IndexKeySetList) 310 304 { 311 305 map<int, pair<double,int> > *AdaptiveCriteriaList = new map<int, pair<double,int> >; … … 313 307 double Value = 0.; 314 308 char buffer[MAXSTRINGSIZE]; 315 sprintf(buffer, "%s/%s%s.dat", path, FRAGMENTPREFIX, ENERGYPERFRAGMENT); 316 ifstream InputFile(buffer, ios::in); 309 string filename = path + ENERGYPERFRAGMENT; 310 ifstream InputFile(filename.c_str()); 311 312 if (InputFile.fail()) { 313 DoeLog(1) && (eLog() << Verbose(1) << "Cannot find file " << filename << "." << endl); 314 return AdaptiveCriteriaList; 315 } 317 316 318 317 if (CountLinesinFile(InputFile) > 0) { … … 419 418 420 419 /** Checks whether the OrderAtSite is still below \a Order at some site. 421 * \param *out output stream for debugging422 420 * \param *AtomMask defines true/false per global Atom::nr to mask in/out each nuclear site, used to activate given number of site to increment order adaptively 423 421 * \param *GlobalKeySetList list of keysets with global ids (valid in "this" molecule) needed for adaptive increase 424 422 * \param Order desired Order if positive, desired exponent in threshold criteria if negative (0 is single-step) 425 423 * \param *MinimumRingSize array of max. possible order to avoid loops 426 * \param *path path to ENERGYPERFRAGMENT file (may be NULL if Order is non-negative)424 * \param path path to ENERGYPERFRAGMENT file (may be NULL if Order is non-negative) 427 425 * \return true - needs further fragmentation, false - does not need fragmentation 428 426 */ 429 bool molecule::CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, char *path)427 bool molecule::CheckOrderAtSite(bool *AtomMask, Graph *GlobalKeySetList, int Order, int *MinimumRingSize, std::string path) 430 428 { 431 429 bool status = false; … … 585 583 * of vertex indices: Global always means the index in "this" molecule, whereas local refers to the molecule or 586 584 * subgraph in the MoleculeListClass. 587 * \param *out output stream for debugging588 585 * \param Order up to how many neighbouring bonds a fragment contains in BondOrderScheme::BottumUp scheme 589 * \param *configuration configuration for writing config files for each fragment586 * \param &prefix path and prefix of the bond order configs to be written 590 587 * \return 1 - continue, 2 - stop (no fragmentation occured) 591 588 */ 592 int molecule::FragmentMolecule(int Order, config *configuration)589 int molecule::FragmentMolecule(int Order, std::string &prefix) 593 590 { 594 591 MoleculeListClass *BondFragments = NULL; … … 624 621 625 622 // === compare it with adjacency file === 626 FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule( configuration->configpath, ListOfAtoms);623 FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule(prefix, ListOfAtoms); 627 624 delete[](ListOfAtoms); 628 625 … … 658 655 659 656 // ===== 3. if structure still valid, parse key set file and others ===== 660 FragmentationToDo = FragmentationToDo && ParseKeySetFile( configuration->configpath, ParsedFragmentList);657 FragmentationToDo = FragmentationToDo && ParseKeySetFile(prefix, ParsedFragmentList); 661 658 662 659 // ===== 4. check globally whether there's something to do actually (first adaptivity check) 663 FragmentationToDo = FragmentationToDo && ParseOrderAtSiteFromFile( configuration->configpath);660 FragmentationToDo = FragmentationToDo && ParseOrderAtSiteFromFile(prefix); 664 661 665 662 // =================================== Begin of FRAGMENTATION =============================== … … 672 669 AtomMask[getAtomCount()] = false; 673 670 FragmentationToDo = false; // if CheckOrderAtSite just ones recommends fragmentation, we will save fragments afterwards 674 while ((CheckOrder = CheckOrderAtSite(AtomMask, ParsedFragmentList, Order, MinimumRingSize, configuration->configpath))) {671 while ((CheckOrder = CheckOrderAtSite(AtomMask, ParsedFragmentList, Order, MinimumRingSize, prefix))) { 675 672 FragmentationToDo = FragmentationToDo || CheckOrder; 676 673 AtomMask[getAtomCount()] = true; // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite() … … 727 724 KeySet test = (*runner).first; 728 725 DoLog(0) && (Log() << Verbose(0) << "Fragment No." << (*runner).second.first << " with TEFactor " << (*runner).second.second << "." << endl); 729 BondFragments->insert(StoreFragmentFromKeySet(test, configuration));726 BondFragments->insert(StoreFragmentFromKeySet(test, World::getInstance().getConfig())); 730 727 k++; 731 728 } … … 739 736 740 737 DoLog(1) && (Log() << Verbose(1) << "Writing " << BondFragments->ListOfMolecules.size() << " possible bond fragmentation configs" << endl); 741 if (BondFragments->OutputConfigForListOfFragments( configuration, SortIndex))738 if (BondFragments->OutputConfigForListOfFragments(prefix, SortIndex)) 742 739 DoLog(1) && (Log() << Verbose(1) << "All configs written." << endl); 743 740 else … … 745 742 746 743 // store force index reference file 747 BondFragments->StoreForcesFile( configuration->configpath, SortIndex);744 BondFragments->StoreForcesFile(prefix, SortIndex); 748 745 749 746 // store keysets file 750 StoreKeySetFile(TotalGraph, configuration->configpath);747 StoreKeySetFile(TotalGraph, prefix); 751 748 752 749 { 753 750 // store Adjacency file 754 char filename[MAXSTRINGSIZE]; 755 strcpy(filename, FRAGMENTPREFIX); 756 strcat(filename, ADJACENCYFILE); 757 StoreAdjacencyToFile(configuration->configpath, filename); 751 std::string filename = prefix + ADJACENCYFILE; 752 StoreAdjacencyToFile(filename); 758 753 } 759 754 760 755 // store Hydrogen saturation correction file 761 BondFragments->AddHydrogenCorrection( configuration->configpath);756 BondFragments->AddHydrogenCorrection(prefix); 762 757 763 758 // store adaptive orders into file 764 StoreOrderAtSiteFile( configuration->configpath);759 StoreOrderAtSiteFile(prefix); 765 760 766 761 // restore orbital and Stop values 767 CalculateOrbitals(*configuration);762 //CalculateOrbitals(*configuration); 768 763 769 764 // free memory for bond part … … 782 777 /** Stores pairs (Atom::nr, Atom::AdaptiveOrder) into file. 783 778 * Atoms not present in the file get "-1". 784 * \param *out output stream for debugging 785 * \param *path path to file ORDERATSITEFILE 779 * \param &path path to file ORDERATSITEFILE 786 780 * \return true - file writable, false - not writable 787 781 */ 788 bool molecule::StoreOrderAtSiteFile( char *path)789 { 790 string streamline;782 bool molecule::StoreOrderAtSiteFile(std::string &path) 783 { 784 string line; 791 785 ofstream file; 792 786 793 line << path << "/" << FRAGMENTPREFIX <<ORDERATSITEFILE;794 file.open(line. str().c_str());787 line = path + ORDERATSITEFILE; 788 file.open(line.c_str()); 795 789 DoLog(1) && (Log() << Verbose(1) << "Writing OrderAtSite " << ORDERATSITEFILE << " ... " << endl); 796 if (file != NULL) {790 if (file.good()) { 797 791 ActOnAllAtoms( &atom::OutputOrder, &file ); 798 792 file.close(); … … 800 794 return true; 801 795 } else { 802 DoLog(1) && (Log() << Verbose(1) << "failed to open file " << line .str()<< "." << endl);796 DoLog(1) && (Log() << Verbose(1) << "failed to open file " << line << "." << endl); 803 797 return false; 804 798 } … … 807 801 /** Parses pairs(Atom::nr, Atom::AdaptiveOrder) from file and stores in molecule's Atom's. 808 802 * Atoms not present in the file get "0". 809 * \param *out output stream for debugging 810 * \param *path path to file ORDERATSITEFILEe 803 * \param &path path to file ORDERATSITEFILEe 811 804 * \return true - file found and scanned, false - file not found 812 805 * \sa ParseKeySetFile() and CheckAdjacencyFileAgainstMolecule() as this is meant to be used in conjunction with the two 813 806 */ 814 bool molecule::ParseOrderAtSiteFromFile( char *path)807 bool molecule::ParseOrderAtSiteFromFile(std::string &path) 815 808 { 816 809 unsigned char *OrderArray = new unsigned char[getAtomCount()]; … … 818 811 bool status; 819 812 int AtomNr, value; 820 string streamline;813 string line; 821 814 ifstream file; 822 815 … … 827 820 828 821 DoLog(1) && (Log() << Verbose(1) << "Begin of ParseOrderAtSiteFromFile" << endl); 829 line << path << "/" << FRAGMENTPREFIX <<ORDERATSITEFILE;830 file.open(line. str().c_str());831 if (file != NULL) {822 line = path + ORDERATSITEFILE; 823 file.open(line.c_str()); 824 if (file.good()) { 832 825 while (!file.eof()) { // parse from file 833 826 AtomNr = -1; … … 850 843 status = true; 851 844 } else { 852 DoLog(1) && (Log() << Verbose(1) << "\t ... failed to open file " << line .str()<< "." << endl);845 DoLog(1) && (Log() << Verbose(1) << "\t ... failed to open file " << line << "." << endl); 853 846 status = false; 854 847 } … … 1717 1710 atom *Walker = NULL; 1718 1711 atom *OtherWalker = NULL; 1719 double * const cell_size = World::getInstance().getDomain(); 1720 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 1712 Matrix matrix = World::getInstance().getDomain().getM(); 1721 1713 enum Shading *ColorList = NULL; 1722 1714 double tmp; … … 1758 1750 Translationvector[i] = (tmp < 0) ? +1. : -1.; 1759 1751 } 1760 Translationvector .MatrixMultiplication(matrix);1752 Translationvector *= matrix; 1761 1753 //Log() << Verbose(3) << "Translation vector is "; 1762 1754 Log() << Verbose(0) << Translationvector << endl; … … 1789 1781 delete(AtomStack); 1790 1782 delete[](ColorList); 1791 delete[](matrix);1792 1783 DoLog(2) && (Log() << Verbose(2) << "End of ScanForPeriodicCorrection." << endl); 1793 1784 }; -
src/molecule_geometry.cpp
r0d5dce r8f822c 19 19 #include "World.hpp" 20 20 #include "Plane.hpp" 21 #include "Matrix.hpp" 22 #include "Box.hpp" 21 23 #include <boost/foreach.hpp> 22 24 … … 33 35 const Vector *Center = DetermineCenterOfAll(); 34 36 const Vector *CenterBox = DetermineCenterOfBox(); 35 double * const cell_size = World::getInstance().getDomain(); 36 double *M = ReturnFullMatrixforSymmetric(cell_size); 37 double *Minv = InverseMatrix(M); 37 Box &domain = World::getInstance().getDomain(); 38 38 39 39 // go through all atoms 40 40 ActOnAllVectors( &Vector::SubtractVector, *Center); 41 41 ActOnAllVectors( &Vector::SubtractVector, *CenterBox); 42 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);43 44 delete[](M);45 delete[](Minv); 42 BOOST_FOREACH(atom* iter, atoms){ 43 *iter->node = domain.WrapPeriodically(*iter->node); 44 } 45 46 46 delete(Center); 47 47 return status; … … 55 55 { 56 56 bool status = true; 57 double * const cell_size = World::getInstance().getDomain(); 58 double *M = ReturnFullMatrixforSymmetric(cell_size); 59 double *Minv = InverseMatrix(M); 57 Box &domain = World::getInstance().getDomain(); 60 58 61 59 // go through all atoms 62 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);63 64 delete[](M);65 delete[](Minv); 60 BOOST_FOREACH(atom* iter, atoms){ 61 *iter->node = domain.WrapPeriodically(*iter->node); 62 } 63 66 64 return status; 67 65 }; … … 152 150 { 153 151 Vector *a = new Vector(0.5,0.5,0.5); 154 155 const double *cell_size = World::getInstance().getDomain(); 156 double *M = ReturnFullMatrixforSymmetric(cell_size); 157 a->MatrixMultiplication(M); 158 delete[](M); 159 152 const Matrix &M = World::getInstance().getDomain().getM(); 153 (*a) *= M; 160 154 return a; 161 155 }; … … 243 237 void molecule::TranslatePeriodically(const Vector *trans) 244 238 { 245 double * const cell_size = World::getInstance().getDomain(); 246 double *M = ReturnFullMatrixforSymmetric(cell_size); 247 double *Minv = InverseMatrix(M); 239 Box &domain = World::getInstance().getDomain(); 248 240 249 241 // go through all atoms 250 242 ActOnAllVectors( &Vector::AddVector, *trans); 251 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);252 253 delete[](M);254 delete[](Minv); 243 BOOST_FOREACH(atom* iter, atoms){ 244 *iter->node = domain.WrapPeriodically(*iter->node); 245 } 246 255 247 }; 256 248 … … 263 255 OBSERVE; 264 256 Plane p(*n,0); 265 BOOST_FOREACH( 257 BOOST_FOREACH(atom* iter, atoms ){ 266 258 (*iter->node) = p.mirrorVector(*iter->node); 267 259 } … … 273 265 void molecule::DeterminePeriodicCenter(Vector ¢er) 274 266 { 275 double * const cell_size = World::getInstance().getDomain(); 276 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 277 double *inversematrix = InverseMatrix(matrix); 267 const Matrix &matrix = World::getInstance().getDomain().getM(); 268 const Matrix &inversematrix = World::getInstance().getDomain().getM(); 278 269 double tmp; 279 270 bool flag; … … 287 278 if ((*iter)->type->Z != 1) { 288 279 #endif 289 Testvector = (*iter)->x; 290 Testvector.MatrixMultiplication(inversematrix); 280 Testvector = inversematrix * (*iter)->x; 291 281 Translationvector.Zero(); 292 282 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { … … 305 295 } 306 296 Testvector += Translationvector; 307 Testvector .MatrixMultiplication(matrix);297 Testvector *= matrix; 308 298 Center += Testvector; 309 299 Log() << Verbose(1) << "vector is: " << Testvector << endl; … … 312 302 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { 313 303 if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) { 314 Testvector = (*Runner)->GetOtherAtom((*iter))->x; 315 Testvector.MatrixMultiplication(inversematrix); 304 Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x; 316 305 Testvector += Translationvector; 317 Testvector .MatrixMultiplication(matrix);306 Testvector *= matrix; 318 307 Center += Testvector; 319 308 Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl; … … 324 313 } 325 314 } while (!flag); 326 delete[](matrix);327 delete[](inversematrix);328 315 329 316 Center.Scale(1./static_cast<double>(getAtomCount())); … … 387 374 DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... "); 388 375 // the eigenvectors specify the transformation matrix 389 ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data ); 376 Matrix M = Matrix(evec->data); 377 BOOST_FOREACH(atom* iter, atoms){ 378 (*iter->node) *= M; 379 } 390 380 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 391 381 -
src/molecule_graph.cpp
r0d5dce r8f822c 12 12 #include "bondgraph.hpp" 13 13 #include "config.hpp" 14 #include "defs.hpp" 14 15 #include "element.hpp" 15 16 #include "helpers.hpp" … … 23 24 #include "Helpers/fast_functions.hpp" 24 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp" 27 #include "Box.hpp" 25 28 26 29 … … 120 123 LinkedCell *LC = NULL; 121 124 bool free_BG = false; 122 double * const cell_size= World::getInstance().getDomain();125 Box &domain = World::getInstance().getDomain(); 123 126 124 127 if (BG == NULL) { … … 177 180 //Log() << Verbose(1) << "Checking distance " << OtherWalker->x.PeriodicDistanceSquared(&(Walker->x), cell_size) << " against typical bond length of " << bonddistance*bonddistance << "." << endl; 178 181 (BG->*minmaxdistance)(Walker, OtherWalker, MinDistance, MaxDistance, IsAngstroem); 179 const double distance = OtherWalker->x.PeriodicDistanceSquared(Walker->x,cell_size);182 const double distance = domain.periodicDistanceSquared(OtherWalker->x,Walker->x); 180 183 const bool status = (distance <= MaxDistance * MaxDistance) && (distance >= MinDistance * MinDistance); 181 184 // Log() << Verbose(1) << "MinDistance is " << MinDistance << " and MaxDistance is " << MaxDistance << "." << endl; … … 1024 1027 /** Storing the bond structure of a molecule to file. 1025 1028 * Simply stores Atom::nr and then the Atom::nr of all bond partners per line. 1026 * \param *path path tofile1027 * \param *filename name of file1029 * \param &filename name of file 1030 * \param path path to file, defaults to empty 1028 1031 * \return true - file written successfully, false - writing failed 1029 1032 */ 1030 bool molecule::StoreAdjacencyToFile( char *path, char *filename)1033 bool molecule::StoreAdjacencyToFile(std::string &filename, std::string path) 1031 1034 { 1032 1035 ofstream AdjacencyFile; 1033 string streamline;1036 string line; 1034 1037 bool status = true; 1035 1038 1036 if (path != NULL)1037 line << path << "/" <<filename;1039 if (path != "") 1040 line = path + "/" + filename; 1038 1041 else 1039 line <<filename;1040 AdjacencyFile.open(line. str().c_str(), ios::out);1042 line = filename; 1043 AdjacencyFile.open(line.c_str(), ios::out); 1041 1044 DoLog(1) && (Log() << Verbose(1) << "Saving adjacency list ... " << endl); 1042 if (AdjacencyFile != NULL) {1045 if (AdjacencyFile.good()) { 1043 1046 AdjacencyFile << "m\tn" << endl; 1044 1047 ActOnAllAtoms(&atom::OutputAdjacency, &AdjacencyFile); … … 1046 1049 DoLog(1) && (Log() << Verbose(1) << "\t... done." << endl); 1047 1050 } else { 1048 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line .str()<< "." << endl);1051 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line << "." << endl); 1049 1052 status = false; 1050 1053 } … … 1056 1059 /** Storing the bond structure of a molecule to file. 1057 1060 * Simply stores Atom::nr and then the Atom::nr of all bond partners, one per line. 1058 * \param *path path tofile1059 * \param *filename name of file1061 * \param &filename name of file 1062 * \param path path to file, defaults to empty 1060 1063 * \return true - file written successfully, false - writing failed 1061 1064 */ 1062 bool molecule::StoreBondsToFile( char *path, char *filename)1065 bool molecule::StoreBondsToFile(std::string &filename, std::string path) 1063 1066 { 1064 1067 ofstream BondFile; 1065 string streamline;1068 string line; 1066 1069 bool status = true; 1067 1070 1068 if (path != NULL)1069 line << path << "/" <<filename;1071 if (path != "") 1072 line = path + "/" + filename; 1070 1073 else 1071 line <<filename;1072 BondFile.open(line. str().c_str(), ios::out);1074 line = filename; 1075 BondFile.open(line.c_str(), ios::out); 1073 1076 DoLog(1) && (Log() << Verbose(1) << "Saving adjacency list ... " << endl); 1074 if (BondFile != NULL) {1077 if (BondFile.good()) { 1075 1078 BondFile << "m\tn" << endl; 1076 1079 ActOnAllAtoms(&atom::OutputBonds, &BondFile); … … 1078 1081 DoLog(1) && (Log() << Verbose(1) << "\t... done." << endl); 1079 1082 } else { 1080 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line .str()<< "." << endl);1083 DoLog(1) && (Log() << Verbose(1) << "\t... failed to open file " << line << "." << endl); 1081 1084 status = false; 1082 1085 } … … 1086 1089 ; 1087 1090 1088 bool CheckAdjacencyFileAgainstMolecule_Init( char *path, ifstream &File, int *&CurrentBonds)1089 { 1090 string streamfilename;1091 filename << path << "/" << FRAGMENTPREFIX <<ADJACENCYFILE;1092 File.open(filename. str().c_str(), ios::out);1091 bool CheckAdjacencyFileAgainstMolecule_Init(std::string &path, ifstream &File, int *&CurrentBonds) 1092 { 1093 string filename; 1094 filename = path + ADJACENCYFILE; 1095 File.open(filename.c_str(), ios::out); 1093 1096 DoLog(1) && (Log() << Verbose(1) << "Looking at bond structure stored in adjacency file and comparing to present one ... " << endl); 1094 if (File == NULL)1097 if (File.fail()) 1095 1098 return false; 1096 1099 … … 1146 1149 * \return true - structure is equal, false - not equivalence 1147 1150 */ 1148 bool molecule::CheckAdjacencyFileAgainstMolecule( char *path, atom **ListOfAtoms)1151 bool molecule::CheckAdjacencyFileAgainstMolecule(std::string &path, atom **ListOfAtoms) 1149 1152 { 1150 1153 ifstream File; -
src/moleculelist.cpp
r0d5dce r8f822c 12 12 #include "atom.hpp" 13 13 #include "bond.hpp" 14 #include "bondgraph.hpp" 14 15 #include "boundary.hpp" 15 16 #include "config.hpp" … … 23 24 #include "periodentafel.hpp" 24 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp" 27 #include "Box.hpp" 25 28 26 29 #include "Helpers/Assert.hpp" … … 379 382 * bonded to the same atom, then we add for this pair a correction term constructed from a Morse 380 383 * potential function fit to QM calculations with respecting to the interatomic hydrogen distance. 381 * \param *out output stream for debugging 382 * \param *path path to file 383 */ 384 bool MoleculeListClass::AddHydrogenCorrection(char *path) 384 * \param &path path to file 385 */ 386 bool MoleculeListClass::AddHydrogenCorrection(std::string &path) 385 387 { 386 388 bond *Binder = NULL; … … 400 402 // 0a. find dimension of matrices with constants 401 403 line = path; 402 line.append("/");403 line += FRAGMENTPREFIX;404 404 line += "1"; 405 405 line += FITCONSTANTSUFFIX; 406 406 input.open(line.c_str()); 407 if (input == NULL) {407 if (input.fail()) { 408 408 DoLog(1) && (Log() << Verbose(1) << endl << "Unable to open " << line << ", is the directory correct?" << endl); 409 409 return false; … … 569 569 570 570 /** Store force indices, i.e. the connection between the nuclear index in the total molecule config and the respective atom in fragment config. 571 * \param *out output stream for debugging 572 * \param *path path to file 571 * \param &path path to file 573 572 * \param *SortIndex Index to map from the BFS labeling to the sequence how of Ion_Type in the config 574 573 * \return true - file written successfully, false - writing failed 575 574 */ 576 bool MoleculeListClass::StoreForcesFile(char *path, 577 int *SortIndex) 575 bool MoleculeListClass::StoreForcesFile(std::string &path, int *SortIndex) 578 576 { 579 577 bool status = true; 580 ofstream ForcesFile; 581 stringstream line; 578 string filename(path); 579 filename += FORCESFILE; 580 ofstream ForcesFile(filename.c_str()); 582 581 periodentafel *periode=World::getInstance().getPeriode(); 583 582 584 583 // open file for the force factors 585 584 DoLog(1) && (Log() << Verbose(1) << "Saving force factors ... "); 586 line << path << "/" << FRAGMENTPREFIX << FORCESFILE; 587 ForcesFile.open(line.str().c_str(), ios::out); 588 if (ForcesFile != NULL) { 585 if (!ForcesFile.fail()) { 589 586 //Log() << Verbose(1) << "Final AtomicForcesList: "; 590 587 //output << prefix << "Forces" << endl; … … 611 608 } else { 612 609 status = false; 613 DoLog(1) && (Log() << Verbose(1) << "failed to open file " << line.str()<< "." << endl);610 DoLog(1) && (Log() << Verbose(1) << "failed to open file " << filename << "." << endl); 614 611 } 615 612 ForcesFile.close(); … … 620 617 /** Writes a config file for each molecule in the given \a **FragmentList. 621 618 * \param *out output stream for debugging 622 * \param *configuration standard configuration to attach atoms in fragment molecule to.619 * \param &prefix path and prefix to the fragment config files 623 620 * \param *SortIndex Index to map from the BFS labeling to the sequence how of Ion_Type in the config 624 621 * \return true - success (each file was written), false - something went wrong. 625 622 */ 626 bool MoleculeListClass::OutputConfigForListOfFragments( config *configuration, int *SortIndex)623 bool MoleculeListClass::OutputConfigForListOfFragments(std::string &prefix, int *SortIndex) 627 624 { 628 625 ofstream outputFragment; 629 char FragmentName[MAXSTRINGSIZE];626 std::string FragmentName; 630 627 char PathBackup[MAXSTRINGSIZE]; 631 628 bool result = true; … … 636 633 int FragmentCounter = 0; 637 634 ofstream output; 638 double cell_size_backup[6]; 639 double * const cell_size = World::getInstance().getDomain(); 640 641 // backup cell_size 642 for (int i=0;i<6;i++) 643 cell_size_backup[i] = cell_size[i]; 635 Matrix cell_size = World::getInstance().getDomain().getM(); 636 Matrix cell_size_backup = cell_size; 637 644 638 // store the fragments as config and as xyz 645 639 for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) { 646 640 // save default path as it is changed for each fragment 647 path = configuration->GetDefaultPath();641 path = World::getInstance().getConfig()->GetDefaultPath(); 648 642 if (path != NULL) 649 643 strcpy(PathBackup, path); … … 658 652 // output xyz file 659 653 FragmentNumber = FixedDigitNumber(ListOfMolecules.size(), FragmentCounter++); 660 sprintf(FragmentName, "%s/%s%s.conf.xyz", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);661 outputFragment.open(FragmentName , ios::out);654 FragmentName = prefix + FragmentNumber + ".conf.xyz"; 655 outputFragment.open(FragmentName.c_str(), ios::out); 662 656 DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as XYZ ..."); 663 657 if ((intermediateResult = (*ListRunner)->OutputXYZ(&outputFragment))) … … 679 673 (*ListRunner)->CenterEdge(&BoxDimension); 680 674 (*ListRunner)->SetBoxDimension(&BoxDimension); // update Box of atoms by boundary 681 int j = -1;682 675 for (int k = 0; k < NDIM; k++) { 683 j += k + 1;684 BoxDimension[k] = 2.5 * (configuration->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem);685 cell_size[j] = BoxDimension[k] * 2.;686 }676 BoxDimension[k] = 2.5 * (World::getInstance().getConfig()->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem); 677 cell_size.at(k,k) = BoxDimension[k] * 2.; 678 } 679 World::getInstance().setDomain(cell_size); 687 680 (*ListRunner)->Translate(&BoxDimension); 688 681 689 682 // also calculate necessary orbitals 690 683 (*ListRunner)->CountElements(); // this is a bugfix, atoms should shoulds actually be added correctly to this fragment 691 (*ListRunner)->CalculateOrbitals(*configuration);684 //(*ListRunner)->CalculateOrbitals(*World::getInstance().getConfig); 692 685 693 686 // change path in config 694 //strcpy(PathBackup, configuration->configpath); 695 sprintf(FragmentName, "%s/%s%s/", PathBackup, FRAGMENTPREFIX, FragmentNumber); 696 configuration->SetDefaultPath(FragmentName); 687 FragmentName = PathBackup; 688 FragmentName += "/"; 689 FragmentName += FRAGMENTPREFIX; 690 FragmentName += FragmentNumber; 691 FragmentName += "/"; 692 World::getInstance().getConfig()->SetDefaultPath(FragmentName.c_str()); 697 693 698 694 // and save as config 699 sprintf(FragmentName, "%s/%s%s.conf", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);695 FragmentName = prefix + FragmentNumber + ".conf"; 700 696 DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as config ..."); 701 if ((intermediateResult = configuration->Save(FragmentName, (*ListRunner)->elemente, (*ListRunner))))697 if ((intermediateResult = World::getInstance().getConfig()->Save(FragmentName.c_str(), (*ListRunner)->elemente, (*ListRunner)))) 702 698 DoLog(0) && (Log() << Verbose(0) << " done." << endl); 703 699 else … … 706 702 707 703 // restore old config 708 configuration->SetDefaultPath(PathBackup);704 World::getInstance().getConfig()->SetDefaultPath(PathBackup); 709 705 710 706 // and save as mpqc input file 711 sprintf(FragmentName, "%s/%s%s.conf", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);707 FragmentName = prefix + FragmentNumber + ".conf"; 712 708 DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as mpqc input ..."); 713 if ((intermediateResult = configuration->SaveMPQC(FragmentName, (*ListRunner))))709 if ((intermediateResult = World::getInstance().getConfig()->SaveMPQC(FragmentName.c_str(), (*ListRunner)))) 714 710 DoLog(2) && (Log() << Verbose(2) << " done." << endl); 715 711 else … … 727 723 728 724 // restore cell_size 729 for (int i=0;i<6;i++) 730 cell_size[i] = cell_size_backup[i]; 725 World::getInstance().setDomain(cell_size_backup); 731 726 732 727 return result; … … 767 762 768 763 // 1. dissect the molecule into connected subgraphs 769 if (!configuration->BG->ConstructBondGraph(mol)) { 770 World::getInstance().destroyMolecule(mol); 771 DoeLog(1) && (eLog()<< Verbose(1) << "There are no bonds." << endl); 764 if (configuration->BG != NULL) { 765 if (!configuration->BG->ConstructBondGraph(mol)) { 766 World::getInstance().destroyMolecule(mol); 767 DoeLog(1) && (eLog()<< Verbose(1) << "There are no bonds." << endl); 768 return; 769 } 770 } else { 771 DoeLog(1) && (eLog()<< Verbose(1) << "There is no BondGraph class present to create bonds." << endl); 772 772 return; 773 773 } … … 884 884 // center at set box dimensions 885 885 mol->CenterEdge(¢er); 886 World::getInstance().getDomain()[0] = center[0]; 887 World::getInstance().getDomain()[1] = 0; 888 World::getInstance().getDomain()[2] = center[1]; 889 World::getInstance().getDomain()[3] = 0; 890 World::getInstance().getDomain()[4] = 0; 891 World::getInstance().getDomain()[5] = center[2]; 886 Matrix domain; 887 for(int i =0;i<NDIM;++i) 888 domain.at(i,i) = center[i]; 889 World::getInstance().setDomain(domain); 892 890 insert(mol); 893 891 } -
src/periodentafel.cpp
r0d5dce r8f822c 32 32 periodentafel::periodentafel() 33 33 { 34 bool status = true; 35 status = LoadElementsDatabase(new stringstream(elementsDB,ios_base::in)); 36 ASSERT(status, "General element initialization failed"); 37 status = LoadValenceDatabase(new stringstream(valenceDB,ios_base::in)); 38 ASSERT(status, "Valence entry of element initialization failed"); 39 status = LoadOrbitalsDatabase(new stringstream(orbitalsDB,ios_base::in)); 40 ASSERT(status, "Orbitals entry of element initialization failed"); 41 status = LoadHBondAngleDatabase(new stringstream(HbondangleDB,ios_base::in)); 42 ASSERT(status, "HBond angle entry of element initialization failed"); 43 status = LoadHBondLengthsDatabase(new stringstream(HbonddistanceDB,ios_base::in)); 44 ASSERT(status, "HBond distance entry of element initialization failed"); 34 { 35 stringstream input(elementsDB,ios_base::in); 36 bool status = LoadElementsDatabase(&input); 37 ASSERT(status, "General element initialization failed"); 38 } 39 { 40 stringstream input(valenceDB,ios_base::in); 41 bool status = LoadValenceDatabase(&input); 42 ASSERT(status, "Valence entry of element initialization failed"); 43 } 44 { 45 stringstream input(orbitalsDB,ios_base::in); 46 bool status = LoadOrbitalsDatabase(&input); 47 ASSERT(status, "Orbitals entry of element initialization failed"); 48 } 49 { 50 stringstream input(HbondangleDB,ios_base::in); 51 bool status = LoadHBondAngleDatabase(&input); 52 ASSERT(status, "HBond angle entry of element initialization failed"); 53 } 54 { 55 stringstream input(HbonddistanceDB,ios_base::in); 56 bool status = LoadHBondLengthsDatabase(&input); 57 ASSERT(status, "HBond distance entry of element initialization failed"); 58 } 45 59 }; 46 60 … … 333 347 ASSERT(Elemental != NULL, "element should be present but is not??"); 334 348 *Elemental = *neues; 349 delete(neues); 350 neues = Elemental; 335 351 } else { 336 352 InserterTest = elements.insert(pair <atomicNumber_t,element*> (neues->getNumber(), neues)); -
src/tesselation.cpp
r0d5dce r8f822c 9 9 10 10 #include <fstream> 11 #include <assert.h>12 11 13 12 #include "helpers.hpp" … … 24 23 #include "Plane.hpp" 25 24 #include "Exceptions/LinearDependenceException.hpp" 26 #include "Helpers/Assert.hpp"27 28 25 #include "Helpers/Assert.hpp" 29 26 … … 2527 2524 baseline = Runner->second; 2528 2525 if (baseline->pointlist.empty()) { 2529 assert((baseline->BaseLine->triangles.size() == 1) && ("Open line without exactly one attached triangle"));2526 ASSERT((baseline->BaseLine->triangles.size() == 1),"Open line without exactly one attached triangle"); 2530 2527 T = (((baseline->BaseLine->triangles.begin()))->second); 2531 2528 DoLog(1) && (Log() << Verbose(1) << "Finding best candidate for open line " << *baseline->BaseLine << " of triangle " << *T << endl); -
src/unittests/LineUnittest.cpp
r0d5dce r8f822c 17 17 18 18 #include <iostream> 19 #include <cmath> 19 20 20 21 using namespace std; -
src/unittests/LinkedCellUnitTest.cpp
r0d5dce r8f822c 264 264 Vector tester; 265 265 LinkedCell::LinkedNodes *ListOfPoints = NULL; 266 atom *Walker = NULL;267 266 size_t size = 0; 268 267 … … 326 325 Vector tester; 327 326 LinkedCell::LinkedNodes *ListOfPoints = NULL; 328 atom *Walker = NULL;329 327 size_t size = 0; 330 328 -
src/unittests/Makefile.am
r0d5dce r8f822c 53 53 GSLLIBS = ../libgslwrapper.a $(BOOST_LIB) ${BOOST_THREAD_LIB} 54 54 ALLLIBS = ../libmolecuilder.a ${GSLLIBS} 55 PARSERLIBS = ../libparser.a ${ALLLIBS} 55 56 56 57 TESTSOURCES = \ … … 203 204 204 205 ParserUnitTest_SOURCES = UnitTestMain.cpp ParserUnitTest.cpp ParserUnitTest.hpp 205 ParserUnitTest_LDADD = ${ ALLLIBS}206 ParserUnitTest_LDADD = ${PARSERLIBS} 206 207 207 208 periodentafelTest_SOURCES = UnitTestMain.cpp periodentafelTest.cpp periodentafelTest.hpp … … 215 216 216 217 SingletonTest_SOURCES = UnitTestMain.cpp SingletonTest.cpp SingletonTest.hpp 217 SingletonTest_LDADD = $ (BOOST_LIB) ${BOOST_THREAD_LIB}218 SingletonTest_LDADD = ${ALLLIBS} $(BOOST_LIB) ${BOOST_THREAD_LIB} 218 219 219 220 StackClassUnitTest_SOURCES = UnitTestMain.cpp stackclassunittest.cpp stackclassunittest.hpp -
src/unittests/ObserverTest.cpp
r0d5dce r8f822c 382 382 // make this Observable its own subject. NEVER DO THIS IN ACTUAL CODE 383 383 simpleObservable1->signOn(simpleObservable1); 384 #ifndef NDEBUG 384 385 CPPUNIT_ASSERT_THROW(simpleObservable1->changeMethod(),Assert::AssertionFailure); 386 #else 387 simpleObservable1->changeMethod(); 388 #endif 385 389 386 390 // more complex test … … 388 392 simpleObservable1->signOn(simpleObservable2); 389 393 simpleObservable2->signOn(simpleObservable1); 394 #ifndef NDEBUG 390 395 CPPUNIT_ASSERT_THROW(simpleObservable1->changeMethod(),Assert::AssertionFailure); 396 #else 397 simpleObservable1->changeMethod(); 398 #endif 399 400 391 401 simpleObservable1->signOff(simpleObservable2); 392 402 simpleObservable2->signOff(simpleObservable1); -
src/unittests/ParserUnitTest.cpp
r0d5dce r8f822c 12 12 #include <cppunit/ui/text/TestRunner.h> 13 13 14 #include "Parser/MpqcParser.hpp" 15 #include "Parser/PcpParser.hpp" 16 #include "Parser/TremoloParser.hpp" 14 17 #include "Parser/XyzParser.hpp" 15 #include "Parser/TremoloParser.hpp"16 18 #include "World.hpp" 17 19 #include "atom.hpp" … … 29 31 CPPUNIT_TEST_SUITE_REGISTRATION( ParserUnitTest ); 30 32 33 static string waterPcp = "# ParallelCarParinello - main configuration file - created with molecuilder\n\ 34 \n\ 35 mainname\tpcp\t# programm name (for runtime files)\n\ 36 defaultpath\not specified\t# where to put files during runtime\n\ 37 pseudopotpath\not specified\t# where to find pseudopotentials\n\ 38 \n\ 39 ProcPEGamma\t8\t# for parallel computing: share constants\n\ 40 ProcPEPsi\t1\t# for parallel computing: share wave functions\n\ 41 DoOutVis\t0\t# Output data for OpenDX\n\ 42 DoOutMes\t1\t# Output data for measurements\n\ 43 DoOutOrbitals\t0\t# Output all Orbitals\n\ 44 DoOutCurr\t0\t# Ouput current density for OpenDx\n\ 45 DoOutNICS\t0\t# Output Nucleus independent current shieldings\n\ 46 DoPerturbation\t0\t# Do perturbation calculate and determine susceptibility and shielding\n\ 47 DoFullCurrent\t0\t# Do full perturbation\n\ 48 DoConstrainedMD\t0\t# Do perform a constrained (>0, relating to current MD step) instead of unconstrained (0) MD\n\ 49 Thermostat\tBerendsen\t2.5\t# Which Thermostat and its parameters to use in MD case.\n\ 50 CommonWannier\t0\t# Put virtual centers at indivual orbits, all common, merged by variance, to grid point, to cell center\n\ 51 SawtoothStart\t0.01\t# Absolute value for smooth transition at cell border \n\ 52 VectorPlane\t0\t# Cut plane axis (x, y or z: 0,1,2) for two-dim current vector plot\n\ 53 VectorCut\t0\t# Cut plane axis value\n\ 54 AddGramSch\t1\t# Additional GramSchmidtOrtogonalization to be safe\n\ 55 Seed\t1\t# initial value for random seed for Psi coefficients\n\ 56 \n\ 57 MaxOuterStep\t0\t# number of MolecularDynamics/Structure optimization steps\n\ 58 Deltat\t0.01\t# time per MD step\n\ 59 OutVisStep\t10\t# Output visual data every ...th step\n\ 60 OutSrcStep\t5\t# Output \"restart\" data every ..th step\n\ 61 TargetTemp\t0.000950045\t# Target temperature\n\ 62 MaxPsiStep\t3\t# number of Minimisation steps per state (0 - default)\n\ 63 EpsWannier\t1e-07\t# tolerance value for spread minimisation of orbitals\n\ 64 # Values specifying when to stop\n\ 65 MaxMinStep\t100\t# Maximum number of steps\n\ 66 RelEpsTotalE\t1e-07\t# relative change in total energy\n\ 67 RelEpsKineticE\t1e-05\t# relative change in kinetic energy\n\ 68 MaxMinStopStep\t2\t# check every ..th steps\n\ 69 MaxMinGapStopStep\t1\t# check every ..th steps\n\ 70 \n\ 71 # Values specifying when to stop for INIT, otherwise same as above\n\ 72 MaxInitMinStep\t100\t# Maximum number of steps\n\ 73 InitRelEpsTotalE\t1e-05\t# relative change in total energy\n\ 74 InitRelEpsKineticE\t0.0001\t# relative change in kinetic energy\n\ 75 InitMaxMinStopStep\t2\t# check every ..th steps\n\ 76 InitMaxMinGapStopStep\t1\t# check every ..th steps\n\ 77 \n\ 78 BoxLength\t# (Length of a unit cell)\n\ 79 20\n\ 80 0\t20\n\ 81 0\t0\t20\n\ 82 \n\ 83 ECut\t128\t# energy cutoff for discretization in Hartrees\n\ 84 MaxLevel\t5\t# number of different levels in the code, >=2\n\ 85 Level0Factor\t2\t# factor by which node number increases from S to 0 level\n\ 86 RiemannTensor\t0\t# (Use metric)\n\ 87 PsiType\t0\t# 0 - doubly occupied, 1 - SpinUp,SpinDown\n\ 88 MaxPsiDouble\t2\t# here: specifying both maximum number of SpinUp- and -Down-states\n\ 89 PsiMaxNoUp\t2\t# here: specifying maximum number of SpinUp-states\n\ 90 PsiMaxNoDown\t2\t# here: specifying maximum number of SpinDown-states\n\ 91 AddPsis\t0\t# Additional unoccupied Psis for bandgap determination\n\ 92 \n\ 93 RCut\t20\t# R-cut for the ewald summation\n\ 94 StructOpt\t0\t# Do structure optimization beforehand\n\ 95 IsAngstroem\t1\t# 0 - Bohr, 1 - Angstroem\n\ 96 RelativeCoord\t0\t# whether ion coordinates are relative (1) or absolute (0)\n\ 97 MaxTypes\t2\t# maximum number of different ion types\n\ 98 \n\ 99 # Ion type data (PP = PseudoPotential, Z = atomic number)\n\ 100 #Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol\n\ 101 Ion_Type1\t2\t1\t1.0\t3\t3\t1.008\tHydrogen\tH\n\ 102 Ion_Type2\t1\t8\t1.0\t3\t3\t15.999\tOxygen\tO\n\ 103 #Ion_TypeNr._Nr.R[0]\tR[1]\tR[2]\tMoveType (0 MoveIon, 1 FixedIon)\n\ 104 Ion_Type2_1\t0.000000000\t0.000000000\t0.000000000\t0 # molecule nr 0\n\ 105 Ion_Type1_1\t0.758602\t0.000000000\t0.504284\t0 # molecule nr 1\n\ 106 Ion_Type1_2\t0.758602\t0.000000000\t-0.504284\t0 # molecule nr 2\n"; 107 static string waterMpqc ="% Created by MoleCuilder\n\ 108 mpqc: (\n\ 109 \tsavestate = no\n\ 110 \tdo_gradient = yes\n\ 111 \tmole<MBPT2>: (\n\ 112 \t\tmaxiter = 200\n\ 113 \t\tbasis = $:basis\n\ 114 \t\tmolecule = $:molecule\n\ 115 \t\treference<CLHF>: (\n\ 116 \t\t\tbasis = $:basis\n\ 117 \t\t\tmolecule = $:molecule\n\ 118 \t\t)\n\ 119 \t)\n\ 120 )\n\ 121 molecule<Molecule>: (\n\ 122 \tunit = angstrom\n\ 123 \t{ atoms geometry } = {\n\ 124 \t\tO [ -0.505735\t0\t0 ]\n\ 125 \t\tH [ 0.252867\t0\t0.504284 ]\n\ 126 \t\tH [ 0.252867\t0\t-0.504284 ]\n\ 127 \t}\n\ 128 )\n\ 129 basis<GaussianBasisSet>: (\n\ 130 \tname = \"3-21G\"\n\ 131 \tmolecule = $:molecule\n\ 132 )\n"; 133 static string waterXyz = "3\nH2O: water molecule\nO\t0\t0\t0\nH\t0.758602\t0\t0.504284\nH\t0.758602\t0\t-0.504284\n"; 134 static string Tremolo_Atomdata1 = "# ATOMDATA\tId\tname\tType\tx=3\n"; 135 static string Tremolo_Atomdata2 = "#\n#ATOMDATA Id name Type x=3\n1 hydrogen H 3.0 4.5 0.1\n\n"; 136 static string Tremolo_invalidkey = "#\n#ATOMDATA Id name foo Type x=3\n\n\n"; 137 static string Tremolo_velocity = "#\n#ATOMDATA Id name Type u=3\n1 hydrogen H 3.0 4.5 0.1\n\n"; 138 static string Tremolo_neighbours = "#\n#ATOMDATA Id Type neighbors=2\n1 H 3 0\n2 H 3 0\n3 O 1 2\n"; 139 static string Tremolo_improper = "#\n#ATOMDATA Id Type imprData\n8 H 9-10\n9 H 10-8,8-10\n10 O -\n"; 140 static string Tremolo_torsion = "#\n#ATOMDATA Id Type torsion\n8 H 9-10\n9 H 10-8,8-10\n10 O -\n"; 141 static string Tremolo_full = "# ATOMDATA\tx=3\tu=3\tF\tstress\tId\tneighbors=5\timprData\tGroupMeasureTypeNo\tType\textType\tname\tresName\tchainID\tresSeq\toccupancy\ttempFactor\tsegID\tCharge\tcharge\tGrpTypeNo\ttorsion\n0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t-\t0\tH\t-\t-\t-\t0\t0\t0\t0\t0\t0\t0\t0\t-\t\n"; 31 142 32 143 void ParserUnitTest::setUp() { 33 144 World::getInstance(); 145 146 // we need hydrogens and oxygens in the following tests 147 CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(1) != NULL); 148 CPPUNIT_ASSERT(World::getInstance().getPeriode()->FindElement(8) != NULL); 34 149 } 35 150 36 151 void ParserUnitTest::tearDown() { 152 ChangeTracker::purgeInstance(); 37 153 World::purgeInstance(); 38 154 } … … 43 159 cout << "Testing the XYZ parser." << endl; 44 160 XyzParser* testParser = new XyzParser(); 45 string waterXyz = "3\nH2O: water molecule\nO\t0.000000\t0.000000\t0.000000\nH\t0.758602\t0.000000\t0.504284\nH\t0.758602\t0.000000\t-0.504284\n";46 161 stringstream input; 47 162 input << waterXyz; … … 62 177 TremoloParser* testParser = new TremoloParser(); 63 178 stringstream input, output; 64 string waterTremolo;65 179 66 180 // Atomdata beginning with "# ATOMDATA" 67 waterTremolo = "# ATOMDATA\tId\tname\tType\tx=3\n"; 68 input << waterTremolo; 69 testParser->load(&input); 70 testParser->save(&output); 71 CPPUNIT_ASSERT(waterTremolo == output.str()); 181 input << Tremolo_Atomdata1; 182 testParser->load(&input); 183 testParser->save(&output); 184 CPPUNIT_ASSERT(Tremolo_Atomdata1 == output.str()); 72 185 input.clear(); 73 186 output.clear(); 74 187 75 188 // Atomdata beginning with "#ATOMDATA" 76 waterTremolo = "#\n#ATOMDATA Id name Type x=3\n1 hydrogen H 3.0 4.5 0.1\n\n"; 77 input << waterTremolo; 189 input << Tremolo_Atomdata2; 78 190 testParser->load(&input); 79 191 testParser->save(&output); … … 83 195 84 196 // Invalid key in Atomdata line 85 waterTremolo = "#\n#ATOMDATA Id name foo Type x=3\n\n\n"; 86 input << waterTremolo; 197 input << Tremolo_invalidkey; 87 198 testParser->load(&input); 88 199 //TODO: proove invalidity … … 93 204 TremoloParser* testParser = new TremoloParser(); 94 205 stringstream input; 95 string waterTremolo;96 206 97 207 // One simple data line 98 waterTremolo = "#\n#ATOMDATA Id name Type x=3\n1 hydrogen H 3.0 4.5 0.1\n\n"; 99 input << waterTremolo; 208 input << Tremolo_Atomdata2; 100 209 testParser->load(&input); 101 210 CPPUNIT_ASSERT(World::getInstance().getAtom(AtomByType(1))->x[0] == 3.0); … … 106 215 TremoloParser* testParser = new TremoloParser(); 107 216 stringstream input; 108 string waterTremolo;109 217 110 218 // One simple data line 111 waterTremolo = "#\n#ATOMDATA Id name Type u=3\n1 hydrogen H 3.0 4.5 0.1\n\n"; 112 input << waterTremolo; 219 input << Tremolo_velocity; 113 220 testParser->load(&input); 114 221 CPPUNIT_ASSERT(World::getInstance().getAtom(AtomByType(1))->v[0] == 3.0); … … 119 226 TremoloParser* testParser = new TremoloParser(); 120 227 stringstream input; 121 string waterTremolo;122 228 123 229 // Neighbor data 124 waterTremolo = "#\n#ATOMDATA Id Type neighbors=2\n1 H 3 0\n2 H 3 0\n3 O 1 2\n"; 125 input << waterTremolo; 230 input << Tremolo_neighbours; 126 231 testParser->load(&input); 127 232 … … 135 240 TremoloParser* testParser = new TremoloParser(); 136 241 stringstream input, output; 137 string waterTremolo;138 242 139 243 // Neighbor data 140 waterTremolo = "#\n#ATOMDATA Id Type imprData\n8 H 9-10\n9 H 10-8,8-10\n10 O -\n"; 141 input << waterTremolo; 244 input << Tremolo_improper; 142 245 testParser->load(&input); 143 246 testParser->save(&output); … … 151 254 TremoloParser* testParser = new TremoloParser(); 152 255 stringstream input, output; 153 string waterTremolo;154 256 155 257 // Neighbor data 156 waterTremolo = "#\n#ATOMDATA Id Type torsion\n8 H 9-10\n9 H 10-8,8-10\n10 O -\n"; 157 input << waterTremolo; 258 input << Tremolo_torsion; 158 259 testParser->load(&input); 159 260 testParser->save(&output); … … 173 274 testParser->setFieldsForSave("x=3 u=3 F stress Id neighbors=5 imprData GroupMeasureTypeNo Type extType name resName chainID resSeq occupancy tempFactor segID Charge charge GrpTypeNo torsion"); 174 275 testParser->save(&output); 175 CPPUNIT_ASSERT(output.str() == "# ATOMDATA\tx=3\tu=3\tF\tstress\tId\tneighbors=5\timprData\tGroupMeasureTypeNo\tType\textType\tname\tresName\tchainID\tresSeq\toccupancy\ttempFactor\tsegID\tCharge\tcharge\tGrpTypeNo\ttorsion\n0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t-\t0\tH\t-\t-\t-\t0\t0\t0\t0\t0\t0\t0\t0\t-\t\n");276 CPPUNIT_ASSERT(output.str() == Tremolo_full); 176 277 177 278 cout << "testing the tremolo parser is done" << endl; 178 279 } 280 281 void ParserUnitTest::readwritePcpTest() { 282 stringstream input(waterPcp); 283 PcpParser* testParser = new PcpParser(); 284 testParser->load(&input); 285 input.clear(); 286 287 CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms()); 288 289 string newWaterPcp = ""; 290 stringstream output; 291 testParser->save(&output); 292 293 input << output; 294 PcpParser* testParser2 = new PcpParser(); 295 testParser2->load(&input); 296 297 CPPUNIT_ASSERT_EQUAL(6, World::getInstance().numAtoms()); 298 299 CPPUNIT_ASSERT(*testParser == *testParser2); 300 } 301 302 void ParserUnitTest::writeMpqcTest() { 303 // build up water molecule 304 atom *Walker = NULL; 305 Walker = World::getInstance().createAtom(); 306 Walker->type = World::getInstance().getPeriode()->FindElement(8); 307 Walker->x = Vector(0,0,0); 308 Walker = World::getInstance().createAtom(); 309 Walker->type = World::getInstance().getPeriode()->FindElement(1); 310 Walker->x = Vector(0.758602,0,0.504284); 311 Walker = World::getInstance().createAtom(); 312 Walker->type = World::getInstance().getPeriode()->FindElement(1); 313 Walker->x = Vector(0.758602,0,-0.504284); 314 CPPUNIT_ASSERT_EQUAL(3, World::getInstance().numAtoms()); 315 316 // create two stringstreams, one stored, one created 317 stringstream input(waterMpqc); 318 MpqcParser* testParser = new MpqcParser(); 319 stringstream output; 320 testParser->save(&output); 321 322 // compare both configs 323 string first = input.str(); 324 string second = output.str(); 325 CPPUNIT_ASSERT(first == second); 326 } -
src/unittests/ParserUnitTest.hpp
r0d5dce r8f822c 22 22 CPPUNIT_TEST ( readAndWriteTremoloTorsionInformationTest ); 23 23 CPPUNIT_TEST ( writeTremoloTest ); 24 CPPUNIT_TEST ( readwritePcpTest ); 25 CPPUNIT_TEST ( writeMpqcTest ); 24 26 CPPUNIT_TEST_SUITE_END(); 25 27 … … 36 38 void readAndWriteTremoloTorsionInformationTest(); 37 39 void writeTremoloTest(); 40 void readwritePcpTest(); 41 void writeMpqcTest(); 38 42 }; 39 43 -
src/unittests/PlaneUnittest.cpp
r0d5dce r8f822c 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cmath> 13 15 14 16 #ifdef HAVE_TESTRUNNER -
src/unittests/linearsystemofequationsunittest.cpp
r0d5dce r8f822c 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 #include <cmath> 14 15 15 16 #include "linearsystemofequationsunittest.hpp" -
src/unittests/manipulateAtomsTest.cpp
r0d5dce r8f822c 87 87 static void operation(atom* _atom){ 88 88 AtomStub *atom = dynamic_cast<AtomStub*>(_atom); 89 assert(atom);89 CPPUNIT_ASSERT(atom); 90 90 atom->doSomething(); 91 91 } … … 100 100 AtomStub *atom; 101 101 atom = dynamic_cast<AtomStub*>(*iter); 102 assert(atom);102 CPPUNIT_ASSERT(atom); 103 103 CPPUNIT_ASSERT(atom->manipulated); 104 104 } … … 114 114 AtomStub *atom; 115 115 atom = dynamic_cast<AtomStub*>(*iter); 116 assert(atom);116 CPPUNIT_ASSERT(atom); 117 117 if(atom->getId()!=(int)ATOM_COUNT/2) 118 118 CPPUNIT_ASSERT(atom->manipulated); -
src/unittests/vectorunittest.cpp
r0d5dce r8f822c 21 21 #include "Plane.hpp" 22 22 #include "Exceptions/LinearDependenceException.hpp" 23 #include "Matrix.hpp" 23 24 24 25 #ifdef HAVE_TESTRUNNER … … 221 222 void VectorTest::IsInParallelepipedTest() 222 223 { 223 double parallelepiped[NDIM*NDIM];224 parallelepiped [0]= 1;225 parallelepiped [1]= 0;226 parallelepiped [2]= 0;227 parallelepiped [3]= 0;228 parallelepiped [4]= 1;229 parallelepiped [5]= 0;230 parallelepiped [6]= 0;231 parallelepiped [7]= 0;232 parallelepiped [8]= 1;224 Matrix parallelepiped; 225 parallelepiped.at(0,0) = 1; 226 parallelepiped.at(1,0) = 0; 227 parallelepiped.at(2,0) = 0; 228 parallelepiped.at(0,1) = 0; 229 parallelepiped.at(1,1) = 1; 230 parallelepiped.at(2,1) = 0; 231 parallelepiped.at(0,2) = 0; 232 parallelepiped.at(1,2) = 0; 233 parallelepiped.at(2,2) = 1; 233 234 234 235 fixture = zero; -
src/vector.cpp
r0d5dce r8f822c 8 8 9 9 #include "vector.hpp" 10 #include "Matrix.hpp" 10 11 #include "verbose.hpp" 11 12 #include "World.hpp" 12 13 #include "Helpers/Assert.hpp" 13 14 #include "Helpers/fast_functions.hpp" 15 #include "Exceptions/MathException.hpp" 14 16 15 17 #include <iostream> 18 #include <gsl/gsl_blas.h> 19 16 20 17 21 using namespace std; … … 34 38 { 35 39 content = gsl_vector_alloc(NDIM); 36 gsl_vector_set(content,0,src[0]); 37 gsl_vector_set(content,1,src[1]); 38 gsl_vector_set(content,2,src[2]); 40 gsl_vector_memcpy(content, src.content); 39 41 } 40 42 … … 49 51 }; 50 52 53 Vector::Vector(gsl_vector *_content) : 54 content(_content) 55 {} 56 51 57 /** 52 58 * Assignment operator … … 55 61 // check for self assignment 56 62 if(&src!=this){ 57 gsl_vector_set(content,0,src[0]); 58 gsl_vector_set(content,1,src[1]); 59 gsl_vector_set(content,2,src[2]); 63 gsl_vector_memcpy(content, src.content); 60 64 } 61 65 return *this; … … 94 98 } 95 99 96 /** Calculates distance between this and another vector in a periodic cell.97 * \param *y array to second vector98 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell99 * \return \f$| x - y |\f$100 */101 double Vector::PeriodicDistance(const Vector &y, const double * const cell_size) const102 {103 double res = distance(y), tmp, matrix[NDIM*NDIM];104 Vector Shiftedy, TranslationVector;105 int N[NDIM];106 matrix[0] = cell_size[0];107 matrix[1] = cell_size[1];108 matrix[2] = cell_size[3];109 matrix[3] = cell_size[1];110 matrix[4] = cell_size[2];111 matrix[5] = cell_size[4];112 matrix[6] = cell_size[3];113 matrix[7] = cell_size[4];114 matrix[8] = cell_size[5];115 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells116 for (N[0]=-1;N[0]<=1;N[0]++)117 for (N[1]=-1;N[1]<=1;N[1]++)118 for (N[2]=-1;N[2]<=1;N[2]++) {119 // create the translation vector120 TranslationVector.Zero();121 for (int i=NDIM;i--;)122 TranslationVector[i] = (double)N[i];123 TranslationVector.MatrixMultiplication(matrix);124 // add onto the original vector to compare with125 Shiftedy = y + TranslationVector;126 // get distance and compare with minimum so far127 tmp = distance(Shiftedy);128 if (tmp < res) res = tmp;129 }130 return (res);131 };132 133 /** Calculates distance between this and another vector in a periodic cell.134 * \param *y array to second vector135 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell136 * \return \f$| x - y |^2\f$137 */138 double Vector::PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const139 {140 double res = DistanceSquared(y), tmp, matrix[NDIM*NDIM];141 Vector Shiftedy, TranslationVector;142 int N[NDIM];143 matrix[0] = cell_size[0];144 matrix[1] = cell_size[1];145 matrix[2] = cell_size[3];146 matrix[3] = cell_size[1];147 matrix[4] = cell_size[2];148 matrix[5] = cell_size[4];149 matrix[6] = cell_size[3];150 matrix[7] = cell_size[4];151 matrix[8] = cell_size[5];152 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells153 for (N[0]=-1;N[0]<=1;N[0]++)154 for (N[1]=-1;N[1]<=1;N[1]++)155 for (N[2]=-1;N[2]<=1;N[2]++) {156 // create the translation vector157 TranslationVector.Zero();158 for (int i=NDIM;i--;)159 TranslationVector[i] = (double)N[i];160 TranslationVector.MatrixMultiplication(matrix);161 // add onto the original vector to compare with162 Shiftedy = y + TranslationVector;163 // get distance and compare with minimum so far164 tmp = DistanceSquared(Shiftedy);165 if (tmp < res) res = tmp;166 }167 return (res);168 };169 170 /** Keeps the vector in a periodic cell, defined by the symmetric \a *matrix.171 * \param *out ofstream for debugging messages172 * Tries to translate a vector into each adjacent neighbouring cell.173 */174 void Vector::KeepPeriodic(const double * const matrix)175 {176 // int N[NDIM];177 // bool flag = false;178 //vector Shifted, TranslationVector;179 // Log() << Verbose(1) << "Begin of KeepPeriodic." << endl;180 // Log() << Verbose(2) << "Vector is: ";181 // Output(out);182 // Log() << Verbose(0) << endl;183 InverseMatrixMultiplication(matrix);184 for(int i=NDIM;i--;) { // correct periodically185 if (at(i) < 0) { // get every coefficient into the interval [0,1)186 at(i) += ceil(at(i));187 } else {188 at(i) -= floor(at(i));189 }190 }191 MatrixMultiplication(matrix);192 // Log() << Verbose(2) << "New corrected vector is: ";193 // Output(out);194 // Log() << Verbose(0) << endl;195 // Log() << Verbose(1) << "End of KeepPeriodic." << endl;196 };197 198 100 /** Calculates scalar product between this and another vector. 199 101 * \param *y array to second vector … … 203 105 { 204 106 double res = 0.; 205 for (int i=NDIM;i--;) 206 res += at(i)*y[i]; 107 gsl_blas_ddot(content, y.content, &res); 207 108 return (res); 208 109 }; … … 461 362 }; 462 363 364 Vector &Vector::operator*=(const Matrix &mat){ 365 (*this) = mat*(*this); 366 return *this; 367 } 368 369 Vector operator*(const Matrix &mat,const Vector &vec){ 370 gsl_vector *res = gsl_vector_calloc(NDIM); 371 gsl_blas_dgemv( CblasNoTrans, 1.0, mat.content, vec.content, 0.0, res); 372 return Vector(res); 373 } 374 375 463 376 /** Factors given vector \a a times \a m. 464 377 * \param a vector … … 508 421 void Vector::Scale(const double factor) 509 422 { 510 for (int i=NDIM;i--;) 511 at(i) *= factor; 512 }; 513 514 /** Given a box by its matrix \a *M and its inverse *Minv the vector is made to point within that box. 515 * \param *M matrix of box 516 * \param *Minv inverse matrix 517 */ 518 void Vector::WrapPeriodically(const double * const M, const double * const Minv) 519 { 520 MatrixMultiplication(Minv); 521 // truncate to [0,1] for each axis 522 for (int i=0;i<NDIM;i++) { 523 //at(i) += 0.5; // set to center of box 524 while (at(i) >= 1.) 525 at(i) -= 1.; 526 while (at(i) < 0.) 527 at(i) += 1.; 528 } 529 MatrixMultiplication(M); 423 gsl_vector_scale(content,factor); 530 424 }; 531 425 … … 546 440 return make_pair(res,helper); 547 441 } 548 549 /** Do a matrix multiplication.550 * \param *matrix NDIM_NDIM array551 */552 void Vector::MatrixMultiplication(const double * const M)553 {554 Vector tmp;555 // do the matrix multiplication556 for(int i=NDIM;i--;)557 tmp[i] = M[i]*at(0)+M[i+3]*at(1)+M[i+6]*at(2);558 559 (*this) = tmp;560 };561 562 /** Do a matrix multiplication with the \a *A' inverse.563 * \param *matrix NDIM_NDIM array564 */565 bool Vector::InverseMatrixMultiplication(const double * const A)566 {567 double B[NDIM*NDIM];568 double detA = RDET3(A);569 double detAReci;570 571 // calculate the inverse B572 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular573 detAReci = 1./detA;574 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11575 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12576 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13577 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21578 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22579 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23580 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31581 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32582 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33583 584 MatrixMultiplication(B);585 586 return true;587 } else {588 return false;589 }590 };591 592 442 593 443 /** Creates this vector as the b y *factors' components scaled linear combination of the given three. … … 679 529 void Vector::AddVector(const Vector &y) 680 530 { 681 for(int i=NDIM;i--;) 682 at(i) += y[i]; 531 gsl_vector_add(content, y.content); 683 532 } 684 533 … … 688 537 void Vector::SubtractVector(const Vector &y) 689 538 { 690 for(int i=NDIM;i--;) 691 at(i) -= y[i]; 539 gsl_vector_sub(content, y.content); 692 540 } 693 541 … … 699 547 * @param three vectors forming the matrix that defines the shape of the parallelpiped 700 548 */ 701 bool Vector::IsInParallelepiped(const Vector &offset, const double * constparallelepiped) const702 { 703 Vector a = (*this)-offset;704 a.InverseMatrixMultiplication(parallelepiped);549 bool Vector::IsInParallelepiped(const Vector &offset, const Matrix& _parallelepiped) const 550 { 551 Matrix parallelepiped = _parallelepiped.invert(); 552 Vector a = parallelepiped * ((*this)-offset); 705 553 bool isInside = true; 706 554 -
src/vector.hpp
r0d5dce r8f822c 13 13 #include <iostream> 14 14 #include <gsl/gsl_vector.h> 15 #include <gsl/gsl_multimin.h>16 15 17 16 #include <memory> … … 24 23 25 24 class Vector; 25 class Matrix; 26 26 27 27 typedef std::vector<Vector> pointset; … … 31 31 */ 32 32 class Vector : public Space{ 33 friend Vector operator*(const Matrix&,const Vector&); 33 34 public: 34 35 35 Vector(); 36 36 Vector(const double x1, const double x2, const double x3); … … 42 42 double DistanceSquared(const Vector &y) const; 43 43 double DistanceToSpace(const Space& space) const; 44 double PeriodicDistance(const Vector &y, const double * const cell_size) const;45 double PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const;46 44 double ScalarProduct(const Vector &y) const; 47 45 double Angle(const Vector &y) const; … … 59 57 void ScaleAll(const double *factor); 60 58 void Scale(const double factor); 61 void MatrixMultiplication(const double * const M);62 bool InverseMatrixMultiplication(const double * const M);63 void KeepPeriodic(const double * const matrix);64 59 bool GetOneNormalVector(const Vector &x1); 65 60 bool MakeNormalTo(const Vector &y1); 66 bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const; 67 void WrapPeriodically(const double * const M, const double * const Minv); 61 bool IsInParallelepiped(const Vector &offset, const Matrix& _parallelepiped) const; 68 62 std::pair<Vector,Vector> partition(const Vector&) const; 69 63 std::pair<pointset,Vector> partition(const pointset&) const; … … 96 90 Vector const operator+(const Vector& b) const; 97 91 Vector const operator-(const Vector& b) const; 92 Vector& operator*=(const Matrix&); 98 93 99 94 // Methods inherited from Space … … 104 99 105 100 private: 101 Vector(gsl_vector *); 106 102 gsl_vector *content; 107 103 … … 118 114 Vector const operator*(const Vector& a, const double m); 119 115 Vector const operator*(const double m, const Vector& a); 116 Vector operator*(const Matrix&,const Vector&); 117 120 118 121 119 #endif /*VECTOR_HPP_*/ -
src/vector_ops.cpp
r0d5dce r8f822c 23 23 #include <gsl/gsl_permutation.h> 24 24 #include <gsl/gsl_vector.h> 25 #include <gsl/gsl_multimin.h> 25 26 26 27 /** -
tests/regression/Domain/4/post/test.conf
r0d5dce r8f822c 47 47 BoxLength # (Length of a unit cell) 48 48 1 49 0 049 0 1 50 50 0 0 2 51 51 -
tests/regression/Domain/6/post/test-x.conf.xyz
r0d5dce r8f822c 1 1 22 2 2 Created by molecuilder on Mon May 31 19:07:16 2010 3 H 9.78209 2.64589 2.64589 4 C 27.2836 3.27519 3.53589 5 C 28.5328 4.15859 3.53589 6 C 29.7821 3.27519 3.53589 7 H 27.2836 2.64589 4.42589 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 27.2836 2.64589 2.64589 12 H 26.3936 3.90454 3.53589 13 H 28.5328 4.78789 4.42589 14 H 28.5328 4.78789 2.64589 15 H 30.672 3.90454 3.53589 16 H 29.7821 2.64589 4.42589 17 H 29.7821 2.64589 2.64589 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 3 H 9.78209 2.64589 2.64589 4 C 27.2836 3.27519 3.53589 5 C 28.5328 4.15859 3.53589 6 C 29.7821 3.27519 3.53589 7 H 27.2836 2.64589 4.42589 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 27.2836 2.64589 2.64589 12 H 26.3936 3.90454 3.53589 13 H 28.5328 4.78789 4.42589 14 H 28.5328 4.78789 2.64589 15 H 30.672 3.90454 3.53589 16 H 29.7821 2.64589 4.42589 17 H 29.7821 2.64589 2.64589 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 -
tests/regression/Domain/6/post/test-y.conf.xyz
r0d5dce r8f822c 1 1 22 2 2 Created by molecuilder on Mon May 31 19:07:16 2010 3 H 9.78209 2.64589 2.64589 4 C 7.28359 23.2752 3.53589 5 C 8.53279 24.1586 3.53589 6 C 9.78209 23.2752 3.53589 7 H 7.28359 22.6459 4.42589 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 7.28359 22.6459 2.64589 12 H 6.39363 23.9045 3.53589 13 H 8.53279 24.7879 4.42589 14 H 8.53279 24.7879 2.64589 15 H 10.672 23.9045 3.53589 16 H 9.78209 22.6459 4.42589 17 H 9.78209 22.6459 2.64589 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 3 H 9.78209 2.64589 2.64589 4 C 7.28359 23.2752 3.53589 5 C 8.53279 24.1586 3.53589 6 C 9.78209 23.2752 3.53589 7 H 7.28359 22.6459 4.42589 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 7.28359 22.6459 2.64589 12 H 6.39363 23.9045 3.53589 13 H 8.53279 24.7879 4.42589 14 H 8.53279 24.7879 2.64589 15 H 10.672 23.9045 3.53589 16 H 9.78209 22.6459 4.42589 17 H 9.78209 22.6459 2.64589 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 -
tests/regression/Domain/6/post/test-z.conf.xyz
r0d5dce r8f822c 1 1 22 2 2 Created by molecuilder on Mon May 31 19:07:16 2010 3 H 9.78209 2.64589 2.64589 4 C 7.28359 3.27519 23.5359 5 C 8.53279 4.15859 23.5359 6 C 9.78209 3.27519 23.5359 7 H 7.28359 2.64589 24.4259 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 7.28359 2.64589 22.6459 12 H 6.39363 3.90454 23.5359 13 H 8.53279 4.78789 24.4259 14 H 8.53279 4.78789 22.6459 15 H 10.672 3.90454 23.5359 16 H 9.78209 2.64589 24.4259 17 H 9.78209 2.64589 22.6459 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 3 H 9.78209 2.64589 2.64589 4 C 7.28359 3.27519 23.5359 5 C 8.53279 4.15859 23.5359 6 C 9.78209 3.27519 23.5359 7 H 7.28359 2.64589 24.4259 8 H 9.78209 2.64589 4.42589 9 H 10.672 3.90454 3.53589 10 H 8.53279 4.78789 2.64589 11 H 7.28359 2.64589 22.6459 12 H 6.39363 3.90454 23.5359 13 H 8.53279 4.78789 24.4259 14 H 8.53279 4.78789 22.6459 15 H 10.672 3.90454 23.5359 16 H 9.78209 2.64589 24.4259 17 H 9.78209 2.64589 22.6459 18 H 8.53279 4.78789 4.42589 19 H 6.39363 3.90454 3.53589 20 H 7.28359 2.64589 2.64589 21 H 7.28359 2.64589 4.42589 22 C 9.78209 3.27519 3.53589 23 C 8.53279 4.15859 3.53589 24 C 7.28359 3.27519 3.53589 -
tests/regression/Domain/6/post/test.conf.xyz
r0d5dce r8f822c 1 1 11 2 2 Created by molecuilder on Mon May 31 19:21:12 2010 3 H 9.78209 2.64589 2.64589 4 H 9.78209 2.64589 4.42589 5 H 10.672 3.90454 3.53589 6 H 8.53279 4.78789 2.64589 7 H 8.53279 4.78789 4.42589 8 H 6.39363 3.90454 3.53589 9 H 7.28359 2.64589 2.64589 10 H 7.28359 2.64589 4.42589 11 C 9.78209 3.27519 3.53589 12 C 8.53279 4.15859 3.53589 13 C 7.28359 3.27519 3.53589 3 H 9.78209 2.64589 2.64589 4 H 9.78209 2.64589 4.42589 5 H 10.672 3.90454 3.53589 6 H 8.53279 4.78789 2.64589 7 H 8.53279 4.78789 4.42589 8 H 6.39363 3.90454 3.53589 9 H 7.28359 2.64589 2.64589 10 H 7.28359 2.64589 4.42589 11 C 9.78209 3.27519 3.53589 12 C 8.53279 4.15859 3.53589 13 C 7.28359 3.27519 3.53589 -
tests/regression/Filling/1/post/test.conf
r0d5dce r8f822c 35 35 RelEpsTotalE 1e-07 # relative change in total energy 36 36 RelEpsKineticE 1e-05 # relative change in kinetic energy 37 MaxMinStopStep 1350 # check every ..th steps37 MaxMinStopStep 680 # check every ..th steps 38 38 MaxMinGapStopStep 1 # check every ..th steps 39 39 … … 42 42 InitRelEpsTotalE 1e-05 # relative change in total energy 43 43 InitRelEpsKineticE 0.0001 # relative change in kinetic energy 44 InitMaxMinStopStep 1350 # check every ..th steps44 InitMaxMinStopStep 680 # check every ..th steps 45 45 InitMaxMinGapStopStep 1 # check every ..th steps 46 46 … … 55 55 RiemannTensor 0 # (Use metric) 56 56 PsiType 0 # 0 - doubly occupied, 1 - SpinUp,SpinDown 57 MaxPsiDouble 1350 # here: specifying both maximum number of SpinUp- and -Down-states58 PsiMaxNoUp 1350 # here: specifying maximum number of SpinUp-states59 PsiMaxNoDown 1350 # here: specifying maximum number of SpinDown-states57 MaxPsiDouble 680 # here: specifying both maximum number of SpinUp- and -Down-states 58 PsiMaxNoUp 680 # here: specifying maximum number of SpinUp-states 59 PsiMaxNoDown 680 # here: specifying maximum number of SpinDown-states 60 60 AddPsis 0 # Additional unoccupied Psis for bandgap determination 61 61 -
tests/regression/Simple_configuration/2/post/test.conf.xyz
r0d5dce r8f822c 1 1 1 2 2 Created by molecuilder on Tue Oct 6 18:34:23 2009 3 H 10 10 10 3 H 10 10 10 -
tests/regression/Simple_configuration/3/post/test.conf.xyz
r0d5dce r8f822c 1 1 1 2 2 Created by molecuilder on Tue Oct 6 18:34:23 2009 3 H 10 10 10 3 H 10 10 10 -
tests/regression/Simple_configuration/4/post/test.conf
r0d5dce r8f822c 35 35 RelEpsTotalE 1e-07 # relative change in total energy 36 36 RelEpsKineticE 1e-05 # relative change in kinetic energy 37 MaxMinStopStep 1# check every ..th steps37 MaxMinStopStep 2 # check every ..th steps 38 38 MaxMinGapStopStep 1 # check every ..th steps 39 39 … … 42 42 InitRelEpsTotalE 1e-05 # relative change in total energy 43 43 InitRelEpsKineticE 0.0001 # relative change in kinetic energy 44 InitMaxMinStopStep 1# check every ..th steps44 InitMaxMinStopStep 2 # check every ..th steps 45 45 InitMaxMinGapStopStep 1 # check every ..th steps 46 46 … … 54 54 Level0Factor 2 # factor by which node number increases from S to 0 level 55 55 RiemannTensor 0 # (Use metric) 56 PsiType 1# 0 - doubly occupied, 1 - SpinUp,SpinDown57 MaxPsiDouble 0# here: specifying both maximum number of SpinUp- and -Down-states58 PsiMaxNoUp 0# here: specifying maximum number of SpinUp-states59 PsiMaxNoDown 1# here: specifying maximum number of SpinDown-states56 PsiType 0 # 0 - doubly occupied, 1 - SpinUp,SpinDown 57 MaxPsiDouble 2 # here: specifying both maximum number of SpinUp- and -Down-states 58 PsiMaxNoUp 2 # here: specifying maximum number of SpinUp-states 59 PsiMaxNoDown 2 # here: specifying maximum number of SpinDown-states 60 60 AddPsis 0 # Additional unoccupied Psis for bandgap determination 61 61 -
tests/regression/Simple_configuration/4/post/test.conf.xyz
r0d5dce r8f822c 1 1 1 2 2 Created by molecuilder on Tue Oct 6 18:31:23 2009 3 C 10 10 10 3 C 10 10 10 -
tests/regression/Simple_configuration/5/post/test.conf
r0d5dce r8f822c 35 35 RelEpsTotalE 1e-07 # relative change in total energy 36 36 RelEpsKineticE 1e-05 # relative change in kinetic energy 37 MaxMinStopStep 1# check every ..th steps37 MaxMinStopStep 0 # check every ..th steps 38 38 MaxMinGapStopStep 1 # check every ..th steps 39 39 … … 42 42 InitRelEpsTotalE 1e-05 # relative change in total energy 43 43 InitRelEpsKineticE 0.0001 # relative change in kinetic energy 44 InitMaxMinStopStep 1# check every ..th steps44 InitMaxMinStopStep 0 # check every ..th steps 45 45 InitMaxMinGapStopStep 1 # check every ..th steps 46 46 … … 54 54 Level0Factor 2 # factor by which node number increases from S to 0 level 55 55 RiemannTensor 0 # (Use metric) 56 PsiType 1# 0 - doubly occupied, 1 - SpinUp,SpinDown56 PsiType 0 # 0 - doubly occupied, 1 - SpinUp,SpinDown 57 57 MaxPsiDouble 0 # here: specifying both maximum number of SpinUp- and -Down-states 58 58 PsiMaxNoUp 0 # here: specifying maximum number of SpinUp-states 59 PsiMaxNoDown 1# here: specifying maximum number of SpinDown-states59 PsiMaxNoDown 0 # here: specifying maximum number of SpinDown-states 60 60 AddPsis 0 # Additional unoccupied Psis for bandgap determination 61 61 -
tests/regression/Simple_configuration/8/post/test.conf.xyz
r0d5dce r8f822c 1 1 144 2 2 Created by molecuilder on Mon May 31 18:50:20 2010 3 H 9.78209 2.64589 2.64589 4 H 9.78209 2.64589 4.42589 5 H 10.672 3.90454 3.53589 6 H 8.53279 4.78789 2.64589 7 H 8.53279 4.78789 4.42589 8 H 6.39363 3.90454 3.53589 9 H 7.28359 2.64589 2.64589 10 H 7.28359 2.64589 4.42589 11 H 0.758602 2.85714 3.86571 12 H 0.758602 2.85714 2.85714 13 H 0.758602 2.85714 5.71429 14 H 0.758602 5.71429 3.86571 15 H 0.758602 5.71429 2.85714 16 H 3.61574 0 1.00857 17 H 3.61574 0 0 18 H 3.61574 0 3.86571 19 H 3.61574 0 2.85714 20 H 3.61574 0 6.72285 21 H 3.61574 0 5.71429 22 H 3.61574 2.85714 1.00857 23 H 3.61574 2.85714 0 24 H 3.61574 2.85714 3.86571 25 H 3.61574 2.85714 2.85714 26 H 3.61574 2.85714 6.72285 27 H 3.61574 2.85714 5.71429 28 H 3.61574 2.85714 8.57143 29 H 3.61574 5.71429 1.00857 30 H 3.61574 5.71429 0 31 H 3.61574 5.71429 3.86571 32 H 3.61574 5.71429 2.85714 33 H 3.61574 5.71429 6.72285 34 H 3.61574 5.71429 5.71429 35 H 3.61574 5.71429 8.57143 36 H 3.61574 8.57143 1.00857 37 H 3.61574 8.57143 3.86571 38 H 3.61574 8.57143 2.85714 39 H 3.61574 8.57143 5.71429 40 H 6.47289 0 1.00857 41 H 6.47289 0 0 42 H 6.47289 0 3.86571 43 H 6.47289 0 2.85714 44 H 6.47289 0 6.72285 45 H 6.47289 0 5.71429 46 H 6.47289 0 9.58 47 H 6.47289 0 8.57143 48 H 6.47289 2.85714 0 49 H 6.47289 2.85714 6.72285 50 H 6.47289 2.85714 9.58 51 H 6.47289 2.85714 8.57143 52 H 6.47289 5.71429 1.00857 53 H 6.47289 5.71429 0 54 H 6.47289 5.71429 6.72285 55 H 6.47289 5.71429 5.71429 56 H 6.47289 5.71429 9.58 57 H 6.47289 5.71429 8.57143 58 H 6.47289 8.57143 1.00857 59 H 6.47289 8.57143 0 60 H 6.47289 8.57143 3.86571 61 H 6.47289 8.57143 2.85714 62 H 6.47289 8.57143 6.72285 63 H 6.47289 8.57143 5.71429 64 H 9.33003 0 1.00857 65 H 9.33003 0 0 66 H 9.33003 0 3.86571 67 H 9.33003 0 2.85714 68 H 9.33003 0 6.72285 69 H 9.33003 0 5.71429 70 H 9.33003 0 8.57143 71 H 9.33003 2.85714 0 72 H 9.33003 2.85714 6.72285 73 H 9.33003 2.85714 9.58 74 H 9.33003 2.85714 8.57143 75 H 9.33003 5.71429 0 76 H 9.33003 5.71429 6.72285 77 H 9.33003 5.71429 9.58 78 H 9.33003 5.71429 8.57143 79 H 9.33003 8.57143 1.00857 80 H 9.33003 8.57143 0 81 H 9.33003 8.57143 3.86571 82 H 9.33003 8.57143 2.85714 83 H 9.33003 8.57143 6.72285 84 H 9.33003 8.57143 5.71429 85 H 12.1872 0 1.00857 86 H 12.1872 0 0 87 H 12.1872 0 3.86571 88 H 12.1872 0 2.85714 89 H 12.1872 0 6.72285 90 H 12.1872 0 5.71429 91 H 12.1872 2.85714 1.00857 92 H 12.1872 2.85714 0 93 H 12.1872 2.85714 6.72285 94 H 12.1872 2.85714 5.71429 95 H 12.1872 5.71429 1.00857 96 H 12.1872 5.71429 0 97 H 12.1872 5.71429 3.86571 98 H 12.1872 5.71429 2.85714 99 H 12.1872 5.71429 6.72285 100 H 12.1872 5.71429 5.71429 101 C 9.78209 3.27519 3.53589 102 C 8.53279 4.15859 3.53589 103 C 7.28359 3.27519 3.53589 104 O 2.85714 0 0.504284 105 O 2.85714 0 3.36143 106 O 2.85714 0 6.21857 107 O 2.85714 2.85714 0.504284 108 O 2.85714 2.85714 3.36143 109 O 2.85714 2.85714 6.21857 110 O 2.85714 5.71429 0.504284 111 O 2.85714 5.71429 3.36143 112 O 2.85714 5.71429 6.21857 113 O 2.85714 8.57143 3.36143 114 O 5.71429 0 0.504284 115 O 5.71429 0 3.36143 116 O 5.71429 0 6.21857 117 O 5.71429 0 9.07571 118 O 5.71429 2.85714 0.504284 119 O 5.71429 2.85714 6.21857 120 O 5.71429 2.85714 9.07571 121 O 5.71429 5.71429 0.504284 122 O 5.71429 5.71429 6.21857 123 O 5.71429 5.71429 9.07571 124 O 5.71429 8.57143 0.504284 125 O 5.71429 8.57143 3.36143 126 O 5.71429 8.57143 6.21857 127 O 8.57143 0 0.504284 128 O 8.57143 0 3.36143 129 O 8.57143 0 6.21857 130 O 8.57143 0 9.07571 131 O 8.57143 2.85714 0.504284 132 O 8.57143 2.85714 9.07571 133 O 8.57143 5.71429 0.504284 134 O 8.57143 5.71429 9.07571 135 O 8.57143 8.57143 0.504284 136 O 8.57143 8.57143 3.36143 137 O 8.57143 8.57143 6.21857 138 O 11.4286 0 0.504284 139 O 11.4286 0 3.36143 140 O 11.4286 0 6.21857 141 O 11.4286 2.85714 0.504284 142 O 11.4286 2.85714 6.21857 143 O 11.4286 2.85714 9.07571 144 O 11.4286 5.71429 0.504284 145 O 11.4286 5.71429 6.21857 146 O 11.4286 8.57143 3.36143 3 H 9.78209 2.64589 2.64589 4 H 9.78209 2.64589 4.42589 5 H 10.672 3.90454 3.53589 6 H 8.53279 4.78789 2.64589 7 H 8.53279 4.78789 4.42589 8 H 6.39363 3.90454 3.53589 9 H 7.28359 2.64589 2.64589 10 H 7.28359 2.64589 4.42589 11 H 0.758602 2.85714 3.86571 12 H 0.758602 2.85714 2.85714 13 H 0.758602 2.85714 5.71429 14 H 0.758602 5.71429 3.86571 15 H 0.758602 5.71429 2.85714 16 H 3.61574 0 1.00857 17 H 3.61574 0 0 18 H 3.61574 0 3.86571 19 H 3.61574 0 2.85714 20 H 3.61574 0 6.72285 21 H 3.61574 0 5.71429 22 H 3.61574 2.85714 1.00857 23 H 3.61574 2.85714 0 24 H 3.61574 2.85714 3.86571 25 H 3.61574 2.85714 2.85714 26 H 3.61574 2.85714 6.72285 27 H 3.61574 2.85714 5.71429 28 H 3.61574 2.85714 8.57143 29 H 3.61574 5.71429 1.00857 30 H 3.61574 5.71429 0 31 H 3.61574 5.71429 3.86571 32 H 3.61574 5.71429 2.85714 33 H 3.61574 5.71429 6.72285 34 H 3.61574 5.71429 5.71429 35 H 3.61574 5.71429 8.57143 36 H 3.61574 8.57143 1.00857 37 H 3.61574 8.57143 3.86571 38 H 3.61574 8.57143 2.85714 39 H 3.61574 8.57143 5.71429 40 H 6.47289 0 1.00857 41 H 6.47289 0 0 42 H 6.47289 0 3.86571 43 H 6.47289 0 2.85714 44 H 6.47289 0 6.72285 45 H 6.47289 0 5.71429 46 H 6.47289 0 9.58 47 H 6.47289 0 8.57143 48 H 6.47289 2.85714 0 49 H 6.47289 2.85714 6.72285 50 H 6.47289 2.85714 9.58 51 H 6.47289 2.85714 8.57143 52 H 6.47289 5.71429 1.00857 53 H 6.47289 5.71429 0 54 H 6.47289 5.71429 6.72285 55 H 6.47289 5.71429 5.71429 56 H 6.47289 5.71429 9.58 57 H 6.47289 5.71429 8.57143 58 H 6.47289 8.57143 1.00857 59 H 6.47289 8.57143 0 60 H 6.47289 8.57143 3.86571 61 H 6.47289 8.57143 2.85714 62 H 6.47289 8.57143 6.72285 63 H 6.47289 8.57143 5.71429 64 H 9.33003 0 1.00857 65 H 9.33003 0 0 66 H 9.33003 0 3.86571 67 H 9.33003 0 2.85714 68 H 9.33003 0 6.72285 69 H 9.33003 0 5.71429 70 H 9.33003 0 8.57143 71 H 9.33003 2.85714 0 72 H 9.33003 2.85714 6.72285 73 H 9.33003 2.85714 9.58 74 H 9.33003 2.85714 8.57143 75 H 9.33003 5.71429 0 76 H 9.33003 5.71429 6.72285 77 H 9.33003 5.71429 9.58 78 H 9.33003 5.71429 8.57143 79 H 9.33003 8.57143 1.00857 80 H 9.33003 8.57143 0 81 H 9.33003 8.57143 3.86571 82 H 9.33003 8.57143 2.85714 83 H 9.33003 8.57143 6.72285 84 H 9.33003 8.57143 5.71429 85 H 12.1872 0 1.00857 86 H 12.1872 0 0 87 H 12.1872 0 3.86571 88 H 12.1872 0 2.85714 89 H 12.1872 0 6.72285 90 H 12.1872 0 5.71429 91 H 12.1872 2.85714 1.00857 92 H 12.1872 2.85714 0 93 H 12.1872 2.85714 6.72285 94 H 12.1872 2.85714 5.71429 95 H 12.1872 5.71429 1.00857 96 H 12.1872 5.71429 0 97 H 12.1872 5.71429 3.86571 98 H 12.1872 5.71429 2.85714 99 H 12.1872 5.71429 6.72285 100 H 12.1872 5.71429 5.71429 101 C 9.78209 3.27519 3.53589 102 C 8.53279 4.15859 3.53589 103 C 7.28359 3.27519 3.53589 104 O 2.85714 0 0.504284 105 O 2.85714 0 3.36143 106 O 2.85714 0 6.21857 107 O 2.85714 2.85714 0.504284 108 O 2.85714 2.85714 3.36143 109 O 2.85714 2.85714 6.21857 110 O 2.85714 5.71429 0.504284 111 O 2.85714 5.71429 3.36143 112 O 2.85714 5.71429 6.21857 113 O 2.85714 8.57143 3.36143 114 O 5.71429 0 0.504284 115 O 5.71429 0 3.36143 116 O 5.71429 0 6.21857 117 O 5.71429 0 9.07571 118 O 5.71429 2.85714 0.504284 119 O 5.71429 2.85714 6.21857 120 O 5.71429 2.85714 9.07571 121 O 5.71429 5.71429 0.504284 122 O 5.71429 5.71429 6.21857 123 O 5.71429 5.71429 9.07571 124 O 5.71429 8.57143 0.504284 125 O 5.71429 8.57143 3.36143 126 O 5.71429 8.57143 6.21857 127 O 8.57143 0 0.504284 128 O 8.57143 0 3.36143 129 O 8.57143 0 6.21857 130 O 8.57143 0 9.07571 131 O 8.57143 2.85714 0.504284 132 O 8.57143 2.85714 9.07571 133 O 8.57143 5.71429 0.504284 134 O 8.57143 5.71429 9.07571 135 O 8.57143 8.57143 0.504284 136 O 8.57143 8.57143 3.36143 137 O 8.57143 8.57143 6.21857 138 O 11.4286 0 0.504284 139 O 11.4286 0 3.36143 140 O 11.4286 0 6.21857 141 O 11.4286 2.85714 0.504284 142 O 11.4286 2.85714 6.21857 143 O 11.4286 2.85714 9.07571 144 O 11.4286 5.71429 0.504284 145 O 11.4286 5.71429 6.21857 146 O 11.4286 8.57143 3.36143 -
tests/regression/testsuite-fragmentation.at
r0d5dce r8f822c 12 12 AT_SETUP([Fragmentation - Fragmentation]) 13 13 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Fragmentation/2/pre/test.conf .], 0) 14 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f 0 --distance 1.55 --order 2], 0, [ignore], [ignore])14 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f ./BondFragment --molecule-by-id 0 --distance 1.55 --order 2], 0, [ignore], [ignore]) 15 15 AT_CHECK([ls -l BondFragment*.conf | wc -l], 0, [5 16 16 ], [ignore]) … … 21 21 AT_SETUP([Fragmentation - BROKEN: Fragmentation is at MaxOrder]) 22 22 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Fragmentation/3/pre/test.conf .], 0) 23 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f 0 --distance 1.55 --order 2], 0, [ignore], [ignore])24 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f 0 --distance 1.55 --order 2], [ignore], [ignore], [ignore])23 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f ./BondFragment --molecule-by-id 0 --distance 1.55 --order 2], 0, [ignore], [ignore]) 24 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -v 1 -f ./BondFragment --molecule-by-id 0 --distance 1.55 --order 2], [ignore], [ignore], [ignore]) 25 25 AT_CLEANUP -
tests/regression/testsuite-simple_configuration.at
r0d5dce r8f822c 52 52 AT_SETUP([Simple configuration - invalid commands on empty configs]) 53 53 AT_KEYWORDS([configuration]) 54 AT_CHECK([../../molecuilder empty.conf -e ${abs_top_srcdir}/src/ -t -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 55 AT_CHECK([fgrep -c "Not enough" stderr], 0, [1 56 ], [ignore]) 54 AT_CHECK([../../molecuilder empty.conf -e ${abs_top_srcdir}/src/ -t -s -b -E -c -b -a -U -T -u], 134, [ignore], [stderr]) 57 55 AT_CLEANUP 58 56 … … 61 59 AT_KEYWORDS([configuration]) 62 60 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Simple_configuration/7/pre/test.conf .], 0) 63 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t], 255, [ignore], [stderr]) 64 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 65 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 66 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 67 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 68 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 69 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 70 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 71 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -c -b -a -U -T -u], 255, [ignore], [stderr]) 72 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 73 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -a -U -T -u], 255, [ignore], [stderr]) 74 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 75 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -a -U -T -u], 255, [ignore], [stderr]) 76 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 77 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -U -T -u], 255, [ignore], [stderr]) 78 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 79 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -T -u], 255, [ignore], [stderr]) 80 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 81 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -u], 255, [ignore], [stderr]) 82 AT_CHECK([fgrep -c "CRITICAL: Not enough" stderr], 0, [ignore], [ignore]) 61 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t], 134, [ignore], [stderr]) 62 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -s -b -E -c -b -a -U -T -u], 134, [ignore], [stderr]) 63 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -E -c -b -a -U -T -u], 134, [ignore], [stderr]) 64 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -E -c -b -a -U -T -u], 134, [ignore], [stderr]) 65 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -c -b -a -U -T -u], 134, [ignore], [stderr]) 66 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -a -U -T -u], 134, [ignore], [stderr]) 67 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -a -U -T -u], 134, [ignore], [stderr]) 68 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -U -T -u], 134, [ignore], [stderr]) 69 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -T -u], 134, [ignore], [stderr]) 70 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -u], 134, [ignore], [stderr]) 83 71 AT_CLEANUP 84 72 -
tests/regression/testsuite-standard_options.at
r0d5dce r8f822c 18 18 AT_SETUP([Standard Options - no element database]) 19 19 AT_KEYWORDS([options]) 20 AT_CHECK([../../molecuilder -e], 255, [ignore], [stderr]) 21 AT_CHECK([fgrep "Not enough or invalid arguments" stderr], 0, [ignore], [ignore]) 20 AT_CHECK([../../molecuilder -e], 134, [ignore], [stderr]) 22 21 AT_CLEANUP 23 22
Note:
See TracChangeset
for help on using the changeset viewer.