Changeset e5c0a1 for src/periodentafel.cpp
- Timestamp:
- Aug 6, 2010, 2:01:13 PM (15 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 822f01
- Parents:
- 2a76b0
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/periodentafel.cpp
r2a76b0 re5c0a1 34 34 { 35 35 stringstream input(elementsDB,ios_base::in); 36 bool status = LoadElementsDatabase( &input);36 bool status = LoadElementsDatabase(input); 37 37 ASSERT(status, "General element initialization failed"); 38 38 } … … 72 72 * \return iterator to added element 73 73 */ 74 periodentafel::iterator periodentafel::AddElement(element * constpointer)74 periodentafel::iterator periodentafel::AddElement(element * pointer) 75 75 { 76 76 atomicNumber_t Z = pointer->getNumber(); … … 85 85 * \param *pointer element to be removed 86 86 */ 87 size_t periodentafel::RemoveElement( element * constpointer)87 size_t periodentafel::RemoveElement(const element * pointer) 88 88 { 89 89 return RemoveElement(pointer->getNumber()); … … 113 113 * \return pointer to element or NULL if not found 114 114 */ 115 element * constperiodentafel::FindElement(atomicNumber_t Z) const115 const element * periodentafel::FindElement(atomicNumber_t Z) const 116 116 { 117 117 const_iterator res = elements.find(Z); … … 124 124 * \return pointer to element 125 125 */ 126 element * constperiodentafel::FindElement(const string &shorthand) const126 const element * periodentafel::FindElement(const string &shorthand) const 127 127 { 128 128 element *res = 0; … … 139 139 * \return desired element or NULL 140 140 */ 141 element * constperiodentafel::AskElement() const142 { 143 element * walker = NULL;141 const element * periodentafel::AskElement() const 142 { 143 const element * walker = NULL; 144 144 int Z; 145 145 do { … … 154 154 * \return pointer to either present or newly created element 155 155 */ 156 element * constperiodentafel::EnterElement()156 const element * periodentafel::EnterElement() 157 157 { 158 158 atomicNumber_t Z = 0; 159 159 DoLog(0) && (Log() << Verbose(0) << "Atomic number: " << Z << endl); 160 160 cin >> Z; 161 element * constres = FindElement(Z);161 const element *res = FindElement(Z); 162 162 if (!res) { 163 163 // TODO: make this using the constructor … … 179 179 180 180 /******************** Access to iterators ****************************/ 181 periodentafel::const_iterator periodentafel::begin() {181 periodentafel::const_iterator periodentafel::begin() const{ 182 182 return elements.begin(); 183 183 } 184 184 185 periodentafel::const_iterator periodentafel::end() {185 periodentafel::const_iterator periodentafel::end() const{ 186 186 return elements.end(); 187 187 } 188 188 189 periodentafel::reverse_iterator periodentafel::rbegin() {189 periodentafel::reverse_iterator periodentafel::rbegin() const{ 190 190 return reverse_iterator(elements.end()); 191 191 } 192 192 193 periodentafel::reverse_iterator periodentafel::rend() {193 periodentafel::reverse_iterator periodentafel::rend() const{ 194 194 return reverse_iterator(elements.begin()); 195 195 } … … 227 227 if (!input.fail()) 228 228 DoLog(0) && (Log() << Verbose(0) << "Using " << filename << " as elements database." << endl); 229 status = status && LoadElementsDatabase( &input);229 status = status && LoadElementsDatabase(input); 230 230 input.close(); 231 231 input.clear(); … … 286 286 * \return true - parsing successful, false - something went wrong 287 287 */ 288 bool periodentafel::LoadElementsDatabase(istream *input)288 bool periodentafel::LoadElementsDatabase(istream &input) 289 289 { 290 290 bool status = true; 291 int counter = 0; 292 pair< std::map<atomicNumber_t,element*>::iterator, bool > InserterTest; 293 if (!(*input).fail()) { 294 (*input).getline(header1, MAXSTRINGSIZE); 295 (*input).getline(header2, MAXSTRINGSIZE); // skip first two header lines 291 string header1tmp,header2tmp; 292 // first parse into a map, so we can revert to old status in case something goes wront 293 map<atomicNumber_t,element*> parsedElements; 294 if (!input.fail()) { 295 getline(input,header1tmp); 296 getline(input,header2tmp); // skip first two header lines 297 cout << "First header: " << header1tmp << endl; 298 cout << "Second header: " << header2tmp << endl; 296 299 DoLog(0) && (Log() << Verbose(0) << "Parsed elements:"); 297 while (! (*input).eof()) {300 while (!input.eof()) { 298 301 element *neues = new element; 299 (*input)>> neues->getName();;300 //(*input) >> ws; 301 (*input)>> neues->getSymbol();302 //(*input) >> ws; 303 (*input)>> neues->period;304 //(*input) >> ws; 305 (*input)>> neues->group;306 //(*input) >> ws; 307 (*input)>> neues->block;308 //(*input) >> ws; 309 (*input)>> neues->Z;310 //(*input) >> ws; 311 (*input)>> neues->mass;312 //(*input) >> ws; 313 (*input)>> neues->CovalentRadius;314 //(*input) >> ws; 315 (*input)>> neues->VanDerWaalsRadius;316 //(*input) >> ws; 317 (*input)>> ws;302 input >> neues->getName();; 303 //(*input) >> ws; 304 input >> neues->getSymbol(); 305 //(*input) >> ws; 306 input >> neues->period; 307 //(*input) >> ws; 308 input >> neues->group; 309 //(*input) >> ws; 310 input >> neues->block; 311 //(*input) >> ws; 312 input >> neues->Z; 313 //(*input) >> ws; 314 input >> neues->mass; 315 //(*input) >> ws; 316 input >> neues->CovalentRadius; 317 //(*input) >> ws; 318 input >> neues->VanDerWaalsRadius; 319 //(*input) >> ws; 320 input >> ws; 318 321 //neues->Output((ofstream *)&cout); 319 322 if ((neues->getNumber() > 0) && (neues->getNumber() < MAX_ELEMENTS)) { 320 if (elements.count(neues->getNumber())) {// if element already present, remove and delete old one (i.e. replace it) 321 //cout << neues->symbol << " is present already." << endl; 322 element * const Elemental = FindElement(neues->getNumber()); 323 ASSERT(Elemental != NULL, "element should be present but is not??"); 324 *Elemental = *neues; 325 delete(neues); 326 neues = Elemental; 327 } else { 328 InserterTest = elements.insert(pair <atomicNumber_t,element*> (neues->getNumber(), neues)); 329 ASSERT(InserterTest.second, "Could not insert new element into periodentafel on LoadElementsDatabase()."); 330 } 323 parsedElements[neues->Z] = neues; 331 324 DoLog(0) && (Log() << Verbose(0) << " " << *neues); 332 counter++;333 325 } else { 334 326 DoeLog(2) && (eLog() << Verbose(2) << "Detected empty line or invalid element in elements db, discarding." << endl); … … 336 328 delete(neues); 337 329 } 330 // when the input is in failed state, we most likely just read garbage 331 if(input.fail()) { 332 DoeLog(2) && (eLog() << Verbose(2) << "Error parsing elements db." << endl); 333 status = false; 334 break; 335 } 338 336 } 339 337 DoLog(0) && (Log() << Verbose(0) << endl); … … 343 341 } 344 342 345 if ( counter == 0)343 if (!parsedElements.size()) 346 344 status = false; 345 346 if(status){ 347 for(map<atomicNumber_t,element*>::iterator iter=parsedElements.begin(); 348 iter!=parsedElements.end(); 349 ++iter){ 350 if (elements.count(iter->first)) { 351 // if element already present, replace the old one 352 // pointer to old element might still be in use, so we have to replace into the old element 353 *(elements[iter->first])=*iter->second; 354 } 355 else { 356 // no such element in periodentafel... we can just insert 357 elements[iter->first] = iter->second; 358 } 359 } 360 // all went well.. we now copy the header 361 strncpy(header1,header1tmp.c_str(),MAXSTRINGSIZE); 362 header1[MAXSTRINGSIZE-1]=0; 363 strncpy(header2,header2tmp.c_str(),MAXSTRINGSIZE); 364 header2[MAXSTRINGSIZE-1]=0; 365 } 347 366 348 367 return status;
Note:
See TracChangeset
for help on using the changeset viewer.