Changes in / [dace6c:e38750]
- Files:
-
- 46 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AtomAction/AddAction.cpp
rdace6c re38750 55 55 #include "Action_impl_pre.hpp" 56 56 /** =========== define the function ====================== */ 57 58 atom * getNewAtom(const AtomAddAction::AtomAddParameters &_params) 59 { 60 atom * first = World::getInstance().createAtom(); 61 first->setType(_params.elemental.get()); 62 first->setPosition(_params.position.get()); 63 64 return first; 65 } 66 67 std::vector<atomId_t> createAtoms( 68 const AtomAddAction::AtomAddParameters &_params, 69 std::vector<molecule *> &_molecules) 70 { 71 std::vector<atomId_t> ids; 72 if (!_molecules.empty()) { 73 if (_molecules.size() == 1) { 74 atom *first = getNewAtom(_params); 75 molecule *mol = *_molecules.begin(); 76 LOG(1, "Adding new atom with element " << first->getType()->getName() 77 << " at " << (first->getPosition()) << " to selected molecule " 78 << mol->getName()+"."); 79 mol->AddAtom(first); 80 ids.push_back(first->getId()); 81 } 82 } else { 83 atom *first = getNewAtom(_params); 84 molecule *mol = World::getInstance().createMolecule(); 85 mol->setName("none"); 86 mol->AddAtom(first); 87 LOG(1, "Adding new atom with element " << first->getType()->getName() 88 << " at " << (first->getPosition()) << " to new molecule."); 89 ids.push_back(first->getId()); 90 } 91 92 return ids; 93 } 94 57 95 ActionState::ptr AtomAddAction::performCall() { 58 96 // execute action 59 atom * first = World::getInstance().createAtom(); 60 first->setType(params.elemental.get()); 61 first->setPosition(params.position.get()); 62 LOG(1, "Adding new atom with element " << first->getType()->getName() << " at " << (first->getPosition()) << "."); 63 // TODO: remove when all of World's atoms are stored. 64 std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 65 if (!molecules.empty()) { 66 std::vector<molecule *>::iterator iter = molecules.begin(); 67 (*iter)->AddAtom(first); 68 } 69 return ActionState::ptr(new AtomAddState(first->getId(), params)); 97 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 98 std::vector<atomId_t> ids = createAtoms(params, molecules); 99 100 if (molecules.size() > 1) 101 return Action::failure; 102 else 103 return ActionState::ptr(new AtomAddState(ids, params)); 70 104 } 71 105 … … 73 107 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 74 108 75 LOG(1, "Removing atom with id " << state->id << "."); 76 World::getInstance().destroyAtom(state->id); 109 for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); 110 iter != state->ids.end(); ++iter) { 111 LOG(1, "Removing atom with id " << *iter << "."); 112 World::getInstance().destroyAtom(*iter); 113 } 77 114 78 115 return ActionState::ptr(_state); … … 82 119 AtomAddState *state = assert_cast<AtomAddState*>(_state.get()); 83 120 84 atom * first = World::getInstance().createAtom(); 85 first->setType(state->params.elemental.get()); 86 first->setPosition(state->params.position.get()); 87 LOG(1, "Re-adding new atom with element " << state->params.elemental.get()->getName() << " at " << state->params.position.get() << "."); 88 // TODO: remove when all of World's atoms are stored. 89 std::vector<molecule *> molecules = World::getInstance().getAllMolecules(); 90 if (!molecules.empty()) { 91 std::vector<molecule *>::iterator iter = molecules.begin(); 92 (*iter)->AddAtom(first); 121 std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 122 std::vector<atomId_t> newids = createAtoms(params, molecules); 123 124 if (newids.size() != state->ids.size()) { 125 STATUS("Could not recreate all atoms after undo."); 126 for (std::vector<atomId_t>::const_iterator iter = newids.begin(); iter != newids.end();++iter) 127 World::getInstance().destroyAtom(*iter); 128 return Action::failure; 93 129 } 94 if (first->getId() != state->id)95 if (!first->changeId(state->id)) {96 STATUS("Could not change atom id "+toString(first->getId())+"->"+toString(state->id)+".");97 return Action::failure;98 }99 130 100 return ActionState::ptr(_state); 131 std::vector<atomId_t>::const_iterator newiter = newids.begin(); 132 std::vector<atomId_t>::const_iterator olditer = state->ids.begin(); 133 bool status=true; 134 for (; newiter != newids.end(); ++newiter, ++olditer) { 135 atom * first = World::getInstance().getAtom(AtomById(*newiter)); 136 ASSERT( first != NULL, 137 "AtomAddAction::performRedo() - re-created atom not present?"); 138 if (first->getId() != *olditer) 139 if (!first->changeId(*olditer)) { 140 STATUS("Could not change atom id "+toString(first->getId())+"->"+toString(*olditer)+"."); 141 // remove all created atoms 142 for (std::vector<atomId_t>::const_iterator iter = state->ids.begin(); iter != olditer;++iter) 143 World::getInstance().destroyAtom(*iter); 144 olditer = state->ids.end(); 145 for (std::vector<atomId_t>::const_iterator iter = newiter; iter != newids.end();++iter) 146 World::getInstance().destroyAtom(*iter); 147 status = false; 148 break; 149 } 150 } 151 ASSERT( olditer == state->ids.end(), 152 "AtomAddAction::performRedo() - after all unequal amount of ids in new and old?"); 153 154 if (!status) { 155 return Action::failure; 156 } else 157 return ActionState::ptr(_state); 101 158 } 102 159 -
src/Actions/AtomAction/AddAction.def
rdace6c re38750 27 27 (BoxVectorValidator()) 28 28 29 #define statetypes ( const atomId_t)30 #define statereferences (id )29 #define statetypes (std::vector<atomId_t>) 30 #define statereferences (ids) 31 31 32 32 // some defines for all the names, you may use ACTION, STATE and PARAMS -
src/Actions/AtomAction/SaturateAction.cpp
rdace6c re38750 79 79 // add the hydrogens 80 80 const Vector AtomsPosition = _atom->getPosition(); 81 double typical_distance = _atom->getType()->getHBondDistance( 1);81 double typical_distance = _atom->getType()->getHBondDistance(0); 82 82 if (typical_distance == -1.) 83 83 typical_distance = 1.; -
src/Actions/WorldAction/SetBoundaryConditionsAction.def
rdace6c re38750 18 18 #define paramtypes (std::vector< std::string >) 19 19 #define paramtokens ("set-boundary-conditions") 20 #define paramdescriptions ("new boundary conditions as list of three strings, e.g. ' wrap wrap ignore'")20 #define paramdescriptions ("new boundary conditions as list of three strings, e.g. 'Wrap Bounce Ignore'") 21 21 #undef paramdefaults 22 22 #define paramreferences (newconditions) -
src/Atom/atom.cpp
rdace6c re38750 264 264 // first we move ourselves in the world 265 265 // the world lets us know if that succeeded 266 atomId_t oldid = id; 266 267 if(world->changeAtomId(id,newId,this)){ 267 268 OBSERVE; 268 269 id = newId; 270 if (mol != NULL) 271 mol->changeAtomId(oldid, newId); 269 272 NOTIFY(IndexChanged); 270 273 return true; -
src/Element/element.cpp
rdace6c re38750 64 64 color[i] = (unsigned char)0; 65 65 for (size_t i =0; i<3;++i) 66 HBondDistance[i] = 0.;67 for (size_t i =0; i<3;++i) 68 HBondAngle[i] = 0.;66 HBondDistance[i] = -1.; 67 for (size_t i =0; i<3;++i) 68 HBondAngle[i] = -1.; 69 69 }; 70 70 -
src/Element/elements_db.cpp
rdace6c re38750 258 258 const char *HbonddistanceDB =\ 259 259 "#atomic number bond distances for single, double and triple bond (-1 no bond)\n\ 260 1 0.74 -1 -1\n\ 261 2 0.77429209 -1 -1\n\ 262 5 1.23 1.19 1.18\n\ 263 6 1.09 1.076 1.06\n\ 264 7 1.04 1.02 1.01\n\ 265 8 0.96 0.957 -1\n\ 266 14 1.48 1.48 1.48\n\ 267 15 1.42 -1 -1\n\ 268 16 1.35 -1 -1\n\ 269 17 1.29 -1 -1\n\ 270 20 1.09 1.09 -1\n\ 271 34 1.47 -1 -1\n\ 272 35 1.44 -1 -1\n\ 260 1 0.741283 -1. -1.\n\ 261 2 0 -1. -1.\n\ 262 3 1.65217 -1. -1.\n\ 263 4 1.3455 -1. -1.\n\ 264 5 1.1962 1.19 1.18\n\ 265 6 1.09234 1.076 1.06\n\ 266 7 1.00154 1.02 1.01\n\ 267 8 0.941566 0.957 -1.\n\ 268 9 0.958865 -1. -1.\n\ 269 10 0 -1. -1.\n\ 270 11 1.9426 -1. -1.\n\ 271 12 1.73705 -1. -1.\n\ 272 13 1.60991 -1. -1.\n\ 273 14 1.49796 1.48 1.48\n\ 274 15 1.39145 -1. -1.\n\ 275 16 1.32987 -1. -1.\n\ 276 17 1.31403 -1. -1.\n\ 277 18 0 -1. -1.\n\ 278 19 2.38168 -1. -1.\n\ 279 20 2.39602 -1. -1.\n\ 280 21 1.69169 -1. -1.\n\ 281 22 1.69817 -1. -1.\n\ 282 23 1.75022 -1. -1.\n\ 283 24 1.79185 -1. -1.\n\ 284 25 1.49581 -1. -1.\n\ 285 26 1.76215 -1. -1.\n\ 286 27 1.4284 -1. -1.\n\ 287 28 1.56442 -1. -1.\n\ 288 29 2.00512 -1. -1.\n\ 289 30 1.55672 -1. -1.\n\ 290 31 1.58872 -1. -1.\n\ 291 32 1.5484 -1. -1.\n\ 292 33 1.47208 -1. -1.\n\ 293 34 1.43322 -1. -1.\n\ 294 35 1.45079 -1. -1.\n\ 295 36 0 -1. -1.\n\ 273 296 "; 274 297 … … 280 303 7 0 110 106.67\n\ 281 304 8 0 104.5 -1\n\ 305 11 0 -1 -1\n\ 282 306 14 0 120 109.47\n\ 283 307 15 0 -1 -1\n\ -
src/Element/unittests/ElementUnitTest.cpp
rdace6c re38750 110 110 CPPUNIT_ASSERT_EQUAL( 0, testelement->getNoValenceOrbitals() ); 111 111 for (size_t i = 0; i < 3; ++i) 112 CPPUNIT_ASSERT_EQUAL( 0., testelement->getHBondDistance(i) );112 CPPUNIT_ASSERT_EQUAL( -1., testelement->getHBondDistance(i) ); 113 113 for (size_t i = 0; i < 3; ++i) 114 CPPUNIT_ASSERT_EQUAL( 0., testelement->getHBondAngle(i) );114 CPPUNIT_ASSERT_EQUAL( -1., testelement->getHBondAngle(i) ); 115 115 } 116 116 -
src/Fragmentation/Exporters/SaturatedBond.cpp
rdace6c re38750 64 64 saturated_atom.getElement().getHBondDistance(saturated_bond.getDegree()-1); 65 65 ASSERT( HydrogenDistance > 0., 66 "SaturatedBond::SaturatedBond() - negative bond distance"); 66 "SaturatedBond::SaturatedBond() - negative bond distance for " 67 +saturated_atom.getElement().getName()); 67 68 const double HydrogenAngle = 68 69 saturated_atom.getElement().getHBondAngle(saturated_bond.getDegree()-1); 69 70 ASSERT( HydrogenAngle >= 0., 70 "SaturatedBond::SaturatedBond() - negative bond angle"); 71 "SaturatedBond::SaturatedBond() - negative bond angle for " 72 +saturated_atom.getElement().getName()); 71 73 LOG(5, "DEBUG: Hydrogen distance is " << HydrogenDistance 72 74 << ", angle is " << HydrogenAngle); -
src/Graph/BondGraph.hpp
rdace6c re38750 221 221 neighboriter != ListOfNeighbors.end(); 222 222 ++neighboriter) { 223 if ((*neighboriter) > Walker) { // just to not add bonds from both sides224 const atom * const OtherWalker = dynamic_cast<const atom *>(*neighboriter);225 ASSERT(OtherWalker != NULL,226 "BondGraph::CreateAdjacency() - TesselPoint "227 +(*neighboriter)->getName()+" that was not an atom retrieved from LinkedList");223 const atom * const OtherWalker = dynamic_cast<const atom *>(*neighboriter); 224 ASSERT(OtherWalker != NULL, 225 "BondGraph::CreateAdjacency() - TesselPoint " 226 +(*neighboriter)->getName()+" that was not an atom retrieved from LinkedList"); 227 if (OtherWalker->getId() > Walker->getId()) { // just to not add bonds from both sides 228 228 LOG(4, "INFO: Current other atom is " << *OtherWalker << "."); 229 229 … … 245 245 } 246 246 } else { 247 LOG( 5, "REJECT: Not Adding: Wrong order.");247 LOG(4, "REJECT: Not Adding: Wrong order."); 248 248 } 249 249 } -
src/Parameters/Specifics/Value_element.cpp
rdace6c re38750 35 35 #include "CodePatterns/MemDebug.hpp" 36 36 37 #include <boost/lexical_cast.hpp> 38 37 39 #include "Value_element.hpp" 38 40 … … 45 47 static const element * FindElementByString(const std::string &_value) 46 48 { 47 static ConvertTo<atomicNumber_t> converter; 48 const element * _element = 49 World::getInstance().getPeriode()->FindElement(converter(_value)); 50 return _element; 49 const element * elem = NULL; 50 try { 51 const int tempvalue = boost::lexical_cast<atomicNumber_t>(_value); 52 elem = World::getInstance().getPeriode()->FindElement(tempvalue); 53 } catch( boost::bad_lexical_cast &e) { 54 elem = World::getInstance().getPeriode()->FindElement(_value); 55 } 56 return elem; 51 57 } 52 58 -
src/Parameters/Specifics/Value_elements.cpp
rdace6c re38750 57 57 for(tokenizer::iterator beg=tok.begin(); 58 58 beg != tok.end();++beg) { 59 const int tempvalue = boost::lexical_cast<atomicNumber_t>(*beg); 60 const element * _element = 61 World::getInstance().getPeriode()->FindElement(tempvalue); 62 ASSERT( _element != NULL, 59 const element * elem = NULL; 60 try { 61 const int tempvalue = boost::lexical_cast<atomicNumber_t>(*beg); 62 elem = World::getInstance().getPeriode()->FindElement(tempvalue); 63 } catch( boost::bad_lexical_cast &e) { 64 elem = World::getInstance().getPeriode()->FindElement(*beg); 65 } 66 ASSERT( elem != NULL, 63 67 "FindElementsByString() - cannnot find element " 64 +toString( tempvalue)+" in periodentafel.");65 elements.push_back( _element);68 +toString(*beg)+" in periodentafel."); 69 elements.push_back(elem); 66 70 } 67 71 return elements; -
src/Parser/MpqcParser.cpp
rdace6c re38750 309 309 *file << "% Created by MoleCuilder" << endl; 310 310 *file << "mpqc: (" << endl; 311 *file << "\tcheckpoint = no" << endl; 311 312 *file << "\tsavestate = " << getParams().getParameter(MpqcParser_Parameters::savestateParam) << endl; 312 313 *file << "\tdo_gradient = " << getParams().getParameter(MpqcParser_Parameters::do_gradientParam) << endl; … … 374 375 ELOG(0, "Unknown level of theory requested for MPQC output file."); 375 376 } 377 const std::string jobtype = getParams().getParameter(MpqcParser_Parameters::jobtypeParam); 378 if (jobtype == getParams().getJobtypeName(MpqcParser_Parameters::Optimization)) { 379 *file << "\t% optimizer object for the molecular geometry" << endl; 380 *file << "\topt<QNewtonOpt>: (" << endl; 381 *file << "\t\tfunction = $..:mole" << endl; 382 *file << "\t\tupdate<BFGSUpdate>: ()" << endl; 383 *file << "\t\tconvergence<MolEnergyConvergence>: (" << endl; 384 *file << "\t\t\tcartesian = yes" << endl; 385 *file << "\t\t\tenergy = $..:..:mole" << endl; 386 *file << "\t\t)" << endl; 387 *file << "\t)" << endl; 388 } 376 389 *file << ")" << endl; 377 390 *file << "molecule<Molecule>: (" << endl; -
src/Parser/MpqcParser_Parameters.cpp
rdace6c re38750 69 69 ParamNames[integrationParam] = "integration"; 70 70 ParamNames[theoryParam] = "theory"; 71 ParamNames[jobtypeParam] = "jobtype"; 71 72 } 72 73 … … 87 88 //InvertMap<TheoryNamesType,TheoryLookupType>(TheoryNames,TheoryLookup); 88 89 90 // create Jobs parameter 91 { 92 ValidJobtypes.clear(); 93 ValidJobtypes.resize(unknownJob); 94 ValidJobtypes[Default]="Default"; 95 ValidJobtypes[Optimization]="Optimization"; 96 appendParameter( 97 new Parameter<std::string>( 98 ParamNames[jobtypeParam], 99 ValidJobtypes, 100 ValidJobtypes[Default])); 101 } 102 89 103 // create integration parameter 90 104 { … … 177 191 } 178 192 193 /** Getter for name of a specific Parameter. 194 * 195 * @param param index among enum Jobtype 196 * @return name of the desired Jobtype 197 */ 198 const std::string &MpqcParser_Parameters::getJobtypeName(const enum Jobtype jobtype) const 199 { 200 return ValidJobtypes[jobtype]; 201 } 202 179 203 /** Getter for the name of specific of IntegrationMethod. 180 204 * -
src/Parser/MpqcParser_Parameters.hpp
rdace6c re38750 58 58 integrationParam,//!< integrationParam, integration method to use in MBPT2 R12 59 59 theoryParam, //!< theoryParam, level of theory to use 60 jobtypeParam, //!< jobtypeParam, job type to use 60 61 unknownParam}; //!< unknownParam, designates an unknown parameter 61 62 … … 69 70 MBPT2_R12, //!< Moeller Plesset Perturbation Theory second order with R12 integral 70 71 unknownTheory //!< designates an unknown theory 72 }; 73 74 /** Enumeration of all known jobtypes. 75 * 76 */ 77 enum Jobtype { 78 Default, //!< standard energy and force calculation 79 Optimization, //!< additional optimization of geometry 80 unknownJob //!< designates an unknown job 71 81 }; 72 82 … … 93 103 const std::string &getParameterName(const enum Parameters param) const; 94 104 const std::string &getTheoryName(const enum Theory theory) const; 105 const std::string &getJobtypeName(const enum Jobtype jobtype) const; 95 106 const std::string &getIntegrationMethodName(const enum IntegrationMethod integration) const; 96 107 … … 99 110 //!> vector with all available theories in same order as enum Theory. 100 111 std::vector<std::string> ValidTheories; 112 113 //!> vector with all available jobtypes in same order as enum Jobs. 114 std::vector<std::string> ValidJobtypes; 101 115 102 116 //!> vector with all available integration methods in same order as enum IntegrationMethod. -
src/Parser/unittests/ParserMpqcUnitTest.cpp
rdace6c re38750 63 63 static string waterMpqc_CLHF ="% Created by MoleCuilder\n\ 64 64 mpqc: (\n\ 65 \tcheckpoint = no\n\ 65 66 \tsavestate = no\n\ 66 67 \tdo_gradient = yes\n\ … … 86 87 static string waterMpqc_CLKS ="% Created by MoleCuilder\n\ 87 88 mpqc: (\n\ 89 \tcheckpoint = no\n\ 88 90 \tsavestate = no\n\ 89 91 \tdo_gradient = yes\n\ … … 110 112 static string waterMpqc_MBPT2 ="% Created by MoleCuilder\n\ 111 113 mpqc: (\n\ 114 \tcheckpoint = no\n\ 112 115 \tsavestate = no\n\ 113 116 \tdo_gradient = yes\n\ … … 138 141 static string waterMpqc_MBPT2_R12 ="% Created by MoleCuilder\n\ 139 142 mpqc: (\n\ 143 \tcheckpoint = no\n\ 140 144 \tsavestate = no\n\ 141 145 \tdo_gradient = yes\n\ -
src/UIElements/CommandLineUI/CommandLineParser.cpp
rdace6c re38750 390 390 // currentOption->hasDefaultValue() ? 391 391 // po::value < const element * >()->default_value(boost::lexical_cast<const element *>(currentOption->getDefaultValue().c_str())) : 392 po::value < int>(),392 po::value < std::string >(), 393 393 currentOption->getDescription().c_str()) 394 394 ; … … 399 399 // currentOption->hasDefaultValue() ? 400 400 // po::value < std::vector<const element *> >()->default_value(boost::lexical_cast< std::vector<const element *> >(currentOption->getDefaultValue().c_str())) : 401 po::value < std::vector< int> >()->multitoken(),401 po::value < std::vector<std::string> >()->multitoken(), 402 402 currentOption->getDescription().c_str()) 403 403 ; -
src/UIElements/CommandLineUI/Query/ElementCommandLineQuery.cpp
rdace6c re38750 36 36 #include "CodePatterns/MemDebug.hpp" 37 37 38 #include <string> 39 38 40 #include "CommandLineUI/Query/CommandLineQuery.hpp" 39 41 #include "CommandLineUI/CommandLineParser.hpp" … … 54 56 // TODO: vector of ints and removing first is not correctly implemented yet. How to remove from a vector? 55 57 periodentafel *periode = World::getInstance().getPeriode(); 56 int Z = -1;57 58 if (CommandLineParser::getInstance().vm.count(getTitle())) { 59 std::string argument("none"); 58 60 try { 59 Z = CommandLineParser::getInstance().vm[getTitle()].as< int >(); 61 argument = CommandLineParser::getInstance().vm[getTitle()].as< std::string >(); 62 try { 63 int Z = -1; 64 Z = boost::lexical_cast<int>(argument); 65 temp = periode->FindElement(Z); 66 } catch(boost::bad_lexical_cast &e) { 67 temp = periode->FindElement(argument); 68 } 60 69 } catch(boost::bad_any_cast &e) { 61 Z = -1;62 70 return false; 63 71 } 64 temp = periode->FindElement(Z);65 72 ASSERT(temp != NULL, "Invalid element specified in ElementCommandLineQuery"); 66 73 return true; -
src/UIElements/CommandLineUI/Query/ElementsCommandLineQuery.cpp
rdace6c re38750 36 36 #include "CodePatterns/MemDebug.hpp" 37 37 38 #include <string> 39 38 40 #include "CommandLineUI/Query/CommandLineQuery.hpp" 39 41 #include "CommandLineUI/CommandLineParser.hpp" … … 51 53 {} 52 54 55 template <typename T> 56 std::vector<const element *> getElementsFromInput(const std::vector<std::string> &_input) 57 { 58 periodentafel *periode = World::getInstance().getPeriode(); 59 std::vector<const element *> result; 60 const element *temp_element; 61 for (typename std::vector<std::string>::const_iterator ZRunner = _input.begin(); ZRunner != _input.end(); ++ZRunner) { 62 const T argument = boost::lexical_cast<T>(*ZRunner); 63 temp_element = periode->FindElement(argument); 64 ASSERT(temp_element != NULL, "Invalid element specified in ElementCommandLineQuery"); 65 result.push_back(temp_element); 66 } 67 return result; 68 } 69 53 70 bool CommandLineDialog::ElementsCommandLineQuery::handle() { 54 71 // TODO: vector of ints and removing first is not correctly implemented yet. How to remove from a vector? 55 periodentafel *periode = World::getInstance().getPeriode();56 std::vector<int> AllElements;57 72 if (CommandLineParser::getInstance().vm.count(getTitle())) { 58 73 try { 59 AllElements = CommandLineParser::getInstance().vm[getTitle()].as< vector<int> >(); 74 std::vector<std::string> AllArguments; 75 AllArguments = CommandLineParser::getInstance().vm[getTitle()].as< vector<std::string> >(); 76 try { 77 temp = getElementsFromInput<int>(AllArguments); 78 } catch(boost::bad_lexical_cast &e) { 79 try { 80 temp = getElementsFromInput<std::string>(AllArguments); 81 } catch(boost::bad_lexical_cast &e) { 82 return false; 83 } 84 } 60 85 } catch(boost::bad_any_cast &e) { 61 AllElements.clear();62 86 return false; 63 87 } 64 const element *temp_element; 65 for (vector<int>::iterator ZRunner = AllElements.begin(); ZRunner != AllElements.end(); ++ZRunner) { 66 temp_element = periode->FindElement(*ZRunner); 67 ASSERT(temp_element != NULL, "Invalid element specified in ElementCommandLineQuery"); 68 temp.push_back(temp_element); 69 } 70 return true; 88 if (temp.empty()) 89 return false; 90 else 91 return true; 71 92 } 72 93 return false; -
src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
rdace6c re38750 85 85 const Observable::channels_t GLMoleculeObject_molecule::AtomsChannels(getAtomsChannels()); 86 86 const Observable::channels_t GLMoleculeObject_molecule::HullChannels(getAllAtomicChangesChannels()); 87 const Observable::channels_t GLMoleculeObject_molecule::BoundingBoxChannels( getAllAtomicChangesChannels());87 const Observable::channels_t GLMoleculeObject_molecule::BoundingBoxChannels(1, molecule::BoundingBoxChanged); 88 88 const Observable::channels_t GLMoleculeObject_molecule::IndexChannels(1, molecule::IndexChanged); 89 89 const Observable::channels_t GLMoleculeObject_molecule::NameChannels(1, molecule::MoleculeNameChanged); … … 403 403 } 404 404 405 GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const406 { 407 BoundingBoxInfo info;405 molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const 406 { 407 molecule::BoundingBoxInfo info; 408 408 info.position = zeroVec; 409 409 info.radius = 0.; … … 411 411 } 412 412 413 GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const414 { 415 BoundingBoxInfo info = BoundingBox.get();413 molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const 414 { 415 molecule::BoundingBoxInfo info = BoundingBox.get(); 416 416 const molecule * const _molecule = getMolecule(MolIndex.get()); 417 417 if (_molecule != NULL) { … … 472 472 void GLMoleculeObject_molecule::resetBoundingBox() 473 473 { 474 BoundingBoxInfo info = BoundingBox.get();474 molecule::BoundingBoxInfo info = BoundingBox.get(); 475 475 setPosition(QVector3D(info.position[0], info.position[1], info.position[2])); 476 476 setScale(info.radius + 0.3); // getBoundingSphere() only sees atoms as points, so make the box a bit bigger -
src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
rdace6c re38750 24 24 #include "GLMoleculeObject_bond.hpp" 25 25 26 #include "molecule.hpp" 27 26 28 class atom; 27 29 class bond; 28 30 class GLMoleculeObject_atom; 29 31 class GLWorldScene; 30 class molecule;31 32 32 33 class GLMoleculeObject_molecule : public GLMoleculeObject, public Observer … … 109 110 typedef std::set<atomId_t> atoms_t; 110 111 111 /** Structure for the required information on the bounding box. 112 * 113 */ 114 struct BoundingBoxInfo { 115 //!> position of center 116 Vector position; 117 //!> radius of sphere 118 double radius; 119 }; 120 121 /** Structure for the required information on the tesselation hull. 122 * 123 */ 124 struct TesselationHullInfo { 125 }; 126 127 BoundingBoxInfo initBoundingBox() const; 112 molecule::BoundingBoxInfo initBoundingBox() const; 128 113 129 114 QGeometryData updateTesselationHull() const; 130 BoundingBoxInfo updateBoundingBox() const;115 molecule::BoundingBoxInfo updateBoundingBox() const; 131 116 atoms_t updateAtoms(); 132 117 moleculeId_t updateIndex() const; … … 153 138 boost::function<std::string ()> MolNameUpdater; 154 139 boost::function<QGeometryData ()> TesselationHullUpdater; 155 boost::function< BoundingBoxInfo ()> BoundingBoxUpdater;140 boost::function<molecule::BoundingBoxInfo ()> BoundingBoxUpdater; 156 141 boost::function<atoms_t ()> PresentAtomsUpdater; 157 142 … … 163 148 Cacheable<QGeometryData> TesselationHull; 164 149 //!> contains newest version of the bounding box on request 165 ObservedValue< BoundingBoxInfo> BoundingBox;150 ObservedValue<molecule::BoundingBoxInfo> BoundingBox; 166 151 //!> contains the current live set of atoms for the molecule 167 152 ObservedValue<atoms_t> PresentAtoms; -
src/World.cpp
rdace6c re38750 396 396 if (isAtomSelected(id)) 397 397 selectedAtoms.erase(id); 398 DeleteAtom(atom); 398 399 atoms.erase(id); 399 DeleteAtom(atom);400 400 atomIdPool.releaseId(id); 401 401 // remove molecule if empty -
src/molecule.cpp
rdace6c re38750 36 36 37 37 #include <algorithm> 38 #include <boost/assign.hpp> 38 39 #include <boost/bind.hpp> 39 40 #include <boost/foreach.hpp> … … 50 51 #include "CodePatterns/enumeration.hpp" 51 52 #include "CodePatterns/Log.hpp" 53 #include "CodePatterns/Observer/Observable.hpp" 52 54 #include "CodePatterns/Observer/Notification.hpp" 53 55 #include "config.hpp" … … 67 69 #include "WorldTime.hpp" 68 70 71 using namespace boost::assign; 72 73 // static entities 74 static Observable::channels_t getBoundingBoxChannels() 75 { 76 Observable::channels_t channels; 77 channels += molecule::AtomInserted, molecule::AtomRemoved, molecule::AtomMoved; 78 return channels; 79 } 69 80 70 81 /************************************* Functions for class molecule *********************************/ … … 83 94 BondCount(this,boost::bind(&molecule::doCountBonds,this),"BondCount"), 84 95 atomIdPool(1, 20, 100), 96 BoundingBoxSweepingAxis(std::vector<AtomDistanceMap_t>(NDIM)), 85 97 _lastchangedatomid(-1), 86 98 last_atom(0) … … 92 104 OurChannel->addChannel(type); 93 105 106 // cannot initialize in initializer body as then channels have not been setup yet 107 BoundingBox.reset( 108 new Cacheable<BoundingBoxInfo>( 109 this, boost::bind(&molecule::updateBoundingBox, boost::cref(this)), "molecule_BoundingBox", getBoundingBoxChannels())); 110 94 111 strcpy(name,World::getInstance().getDefaultName().c_str()); 95 } ;112 } 96 113 97 114 molecule *NewMolecule(){ … … 170 187 } 171 188 189 bool molecule::changeAtomId(int oldId, int newId) 190 { 191 OBSERVE; 192 if ((!atomIds.contains( oldId )) || (atomIds.contains( newId ))) 193 return false; 194 atomIds.erase( oldId ); 195 atomIds.insert( newId ); 196 // also update BoundingBoxSweepingAxis 197 for (int i=0;i<NDIM;++i) { 198 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(oldId); 199 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 200 "molecule::changeAtomId() - could not find atom "+toString(oldId) 201 +" in BoundingBoxSweepingAxis."); 202 const double component = iter->second; 203 BoundingBoxSweepingAxis[i].left.erase(iter); 204 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(newId, component) ); 205 } 206 return true; 207 } 208 172 209 bool molecule::changeId(moleculeId_t newId){ 173 210 // first we move ourselves in the world … … 227 264 atomIds.erase( _atom->getId() ); 228 265 { 266 BoundingBoxInfo oldinfo = updateBoundingBox(); 267 for (int i=0;i<NDIM;++i) 268 BoundingBoxSweepingAxis[i].left.erase( _atom->getId() ); 269 BoundingBoxInfo newinfo = updateBoundingBox(); 270 if (oldinfo != newinfo) 271 NOTIFY(BoundingBoxChanged); 272 } 273 { 229 274 NOTIFY(AtomNrChanged); 230 275 atomIdPool.releaseId(_atom->getNr()); … … 240 285 molecule::const_iterator molecule::erase( atom * key ) 241 286 { 242 OBSERVE;243 {244 _lastchangedatomid = key->getId();245 NOTIFY(AtomRemoved);246 }247 287 const_iterator iter = const_cast<const molecule &>(*this).find(key); 248 if (iter != const_cast<const molecule &>(*this).end()){ 249 ++iter; 250 atomIds.erase( key->getId() ); 251 { 252 NOTIFY(AtomNrChanged); 253 atomIdPool.releaseId(key->getNr()); 254 LocalToGlobalId.erase(key->getNr()); 255 key->setNr(-1); 256 } 257 NOTIFY(FormulaChanged); 258 formula-=key->getType(); 259 key->removeFromMolecule(); 260 } 261 return iter; 288 if (iter != const_cast<const molecule &>(*this).end()) 289 return erase(iter); 290 else 291 return iter; 262 292 } 263 293 … … 269 299 std::pair<iterator,bool> res = atomIds.insert(key->getId()); 270 300 if (res.second) { // push atom if went well 301 { 302 BoundingBoxInfo oldinfo = updateBoundingBox(); 303 for (int i=0;i<NDIM;++i) 304 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(key->getId(), key->getPosition()[i])); 305 BoundingBoxInfo newinfo = updateBoundingBox(); 306 if (oldinfo != newinfo) 307 NOTIFY(BoundingBoxChanged); 308 } 271 309 NOTIFY(AtomNrChanged); 272 310 key->setNr(atomIdPool.getNextId()); … … 1038 1076 } 1039 1077 1078 molecule::BoundingBoxInfo molecule::updateBoundingBox() const 1079 { 1080 BoundingBoxInfo info; 1081 Vector min = zeroVec; 1082 Vector max = zeroVec; 1083 for (int i=0;i<NDIM;++i) { 1084 if (!BoundingBoxSweepingAxis[i].right.empty()) { 1085 min[i] = BoundingBoxSweepingAxis[i].right.begin()->first; 1086 max[i] = BoundingBoxSweepingAxis[i].right.rbegin()->first; 1087 } 1088 } 1089 info.radius = (.5*(max-min)).Norm(); 1090 info.position = .5*(max+min); 1091 return info; 1092 } 1093 1094 molecule::BoundingBoxInfo molecule::getBoundingBox() const 1095 { 1096 return **BoundingBox; 1097 } 1098 1040 1099 void molecule::update(Observable *publisher) 1041 1100 { … … 1057 1116 // emit others about one of our atoms moved 1058 1117 _lastchangedatomid = _atom->getId(); 1118 // update entry in map 1119 BoundingBoxInfo oldinfo = updateBoundingBox(); 1120 for (int i=0;i<NDIM;++i) { 1121 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(_atom->getId()); 1122 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 1123 "molecule::recieveNotification() - could not find atom "+toString(_atom->getId()) 1124 +" in BoundingBoxSweepingAxis."); 1125 BoundingBoxSweepingAxis[i].left.erase(iter); 1126 BoundingBoxSweepingAxis[i].left.insert( 1127 std::make_pair(_atom->getId(), _atom->getPosition()[i]) ); 1128 } 1129 BoundingBoxInfo newinfo = updateBoundingBox(); 1059 1130 OBSERVE; 1060 1131 NOTIFY(AtomMoved); 1132 if (oldinfo != newinfo) 1133 NOTIFY(BoundingBoxChanged); 1061 1134 break; 1062 1135 } -
src/molecule.hpp
rdace6c re38750 22 22 23 23 #include <string> 24 25 #include <boost/bimap/bimap.hpp> 26 #include <boost/bimap/unordered_set_of.hpp> 27 #include <boost/bimap/multiset_of.hpp> 28 #include <boost/optional.hpp> 29 #include <boost/shared_ptr.hpp> 24 30 25 31 #include "AtomIdSet.hpp" … … 115 121 MoleculeNameChanged, 116 122 IndexChanged, 123 BoundingBoxChanged, 117 124 AboutToBeRemoved, 118 125 NotificationType_MAX … … 238 245 bool changeAtomNr(int oldNr, int newNr, atom* target=0); 239 246 247 friend bool atom::changeId(atomId_t newId); 248 /** 249 * used when changing an ParticleInfo::Id. 250 * Note that this number is global (and the molecule uses it to know which atoms belong to it) 251 * 252 * @param oldId old Id 253 * @param newId new Id to set 254 * @return indicates wether the change could be done or not. 255 */ 256 bool changeAtomId(int oldId, int newId); 257 240 258 /** Updates the internal lookup fro local to global indices. 241 259 * … … 260 278 261 279 public: 280 281 /** Structure for the required information on the bounding box. 282 * 283 */ 284 struct BoundingBoxInfo { 285 //!> position of center 286 Vector position; 287 //!> radius of sphere 288 double radius; 289 290 /** Equivalence operator for bounding box. 291 * 292 * \return true - both bounding boxes have same position and radius 293 */ 294 bool operator==(const BoundingBoxInfo &_other) const 295 { return (radius == _other.radius) && (position == _other.position); } 296 297 /** Inequivalence operator for bounding box. 298 * 299 * \return true - bounding boxes have either different positions or different radii or both 300 */ 301 bool operator!=(const BoundingBoxInfo &_other) const 302 { return !(*this == _other); } 303 }; 304 305 private: 306 307 /** Returns the current bounding box. 308 * 309 * \return Shape with center and extension of box 310 */ 311 BoundingBoxInfo updateBoundingBox() const; 312 313 // stuff for keeping bounding box up-to-date efficiently 314 315 //!> Cacheable for the bounding box, ptr such that 316 boost::shared_ptr< Cacheable<BoundingBoxInfo> > BoundingBox; 317 /** Bimap storing atomic ids and the component per axis. 318 * 319 * We need a bimap in order to have the components sorted and be able to 320 * access max and min values in linear time and also access the ids in 321 * constant time in order to update the map, when atoms move, are inserted, 322 * or removed. 323 */ 324 typedef boost::bimaps::bimap< 325 boost::bimaps::unordered_set_of< atomId_t >, 326 boost::bimaps::multiset_of< double, std::greater<double> > 327 > AtomDistanceMap_t; 328 std::vector<AtomDistanceMap_t> BoundingBoxSweepingAxis; 329 330 public: 331 332 /** Returns the current bounding box of this molecule. 333 * 334 * \return bounding box info with center and radius 335 */ 336 BoundingBoxInfo getBoundingBox() const; 262 337 263 338 /** Function to create a bounding spherical shape for the currently associated atoms. -
tests/regression/Atoms/Add/post/test.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Atoms/Add/post/test.pdb
rdace6c re38750 1 1 REMARK created by molecuilder on Wed Feb 2 18:06:07 2011 2 ATOM 1 H01 0 - 0010.000 10.000 10.000 0.00 0.00 H 02 ATOM 1 H01 0non 01 10.000 10.000 10.000 0.00 0.00 H 0 3 3 END -
tests/regression/Atoms/Remove/post/test.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Atoms/Saturate/post/saturated_carbon.xyz
rdace6c re38750 1 1 5 2 Created by molecuilder on Wed Jan 28 20:57:112015, time step 02 Created by molecuilder on Wed Sep 30 19:50:39 2015, time step 0 3 3 C 10 10 10 4 H 11.0 7610 105 H 9.6 4133 11.0145106 H 9.6 4133 9.49277 10.87867 H 9.6 4133 9.49277 9.121454 H 11.0923 10 10 5 H 9.63589 11.0299 10 6 H 9.63589 9.48507 10.8919 7 H 9.63589 9.48507 9.10811 -
tests/regression/Atoms/Saturate/post/saturated_nitrogen.xyz
rdace6c re38750 1 1 4 2 Created by molecuilder on Wed Jan 28 21:41:392015, time step 02 Created by molecuilder on Wed Sep 30 19:50:40 2015, time step 0 3 3 N 10 10 10 4 H 11.0 210 105 H 9.49 10.866 106 H 9.49 9.13397 104 H 11.0015 10 10 5 H 9.49923 10.866 10 6 H 9.49923 9.13397 10 -
tests/regression/Parser/Mpqc/post/doublewater.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Parser/Mpqc/post/empty.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Parser/Mpqc/post/test.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Parser/Mpqc/post/testCLHF.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/post/testCLKS.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/post/testMBPT2.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/post/testMBPT2_R12.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testCLHF.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testCLHF_n.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testCLHF_n_ascend_ids.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testCLHF_n_mixed_ids.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testCLKS.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testMBPT2.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/testMBPT2_R12.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/Mpqc/pre/water.in
rdace6c re38750 1 1 % Created by MoleCuilder 2 2 mpqc: ( 3 checkpoint = no 3 4 savestate = no 4 5 do_gradient = yes -
tests/regression/Parser/SetParameters/Mpqc/post/testCLHF.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes -
tests/regression/Parser/SetParameters/Mpqc/pre/testCLHF.in
rdace6c re38750 1 1 mpqc: ( 2 checkpoint = no 2 3 savestate = no 3 4 do_gradient = yes
Note:
See TracChangeset
for help on using the changeset viewer.