Changeset b5c53d for src/periodentafel.cpp
- Timestamp:
- Aug 9, 2010, 6:33:29 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, Candidate_v1.7.0, Candidate_v1.7.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:
- 353e82
- Parents:
- 458447 (diff), e588312 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/periodentafel.cpp (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/periodentafel.cpp
r458447 rb5c53d 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(); 77 77 ASSERT(!elements.count(Z), "Element is already present."); 78 pointer->sort = &pointer->Z;79 78 if (pointer->getNumber() < 1 && pointer->getNumber() >= MAX_ELEMENTS) 80 79 DoeLog(0) && (eLog() << Verbose(0) << "Invalid Z number!\n"); … … 86 85 * \param *pointer element to be removed 87 86 */ 88 size_t periodentafel::RemoveElement( element * constpointer)87 size_t periodentafel::RemoveElement(const element * pointer) 89 88 { 90 89 return RemoveElement(pointer->getNumber()); … … 114 113 * \return pointer to element or NULL if not found 115 114 */ 116 element * constperiodentafel::FindElement(atomicNumber_t Z) const115 const element * periodentafel::FindElement(atomicNumber_t Z) const 117 116 { 118 117 const_iterator res = elements.find(Z); … … 125 124 * \return pointer to element 126 125 */ 127 element * constperiodentafel::FindElement(const string &shorthand) const126 const element * periodentafel::FindElement(const string &shorthand) const 128 127 { 129 128 element *res = 0; … … 140 139 * \return desired element or NULL 141 140 */ 142 element * constperiodentafel::AskElement() const143 { 144 element * walker = NULL;141 const element * periodentafel::AskElement() const 142 { 143 const element * walker = NULL; 145 144 int Z; 146 145 do { … … 155 154 * \return pointer to either present or newly created element 156 155 */ 157 element * constperiodentafel::EnterElement()156 const element * periodentafel::EnterElement() 158 157 { 159 158 atomicNumber_t Z = 0; 160 159 DoLog(0) && (Log() << Verbose(0) << "Atomic number: " << Z << endl); 161 160 cin >> Z; 162 element * constres = FindElement(Z);161 const element *res = FindElement(Z); 163 162 if (!res) { 164 163 // TODO: make this using the constructor … … 169 168 cin >> tmp->mass; 170 169 DoLog(0) && (Log() << Verbose(0) << "Name [max 64 chars]: " << endl); 171 cin >> tmp-> name;170 cin >> tmp->getName(); 172 171 DoLog(0) && (Log() << Verbose(0) << "Short form [max 3 chars]: " << endl); 173 cin >> tmp-> symbol;172 cin >> tmp->getSymbol(); 174 173 AddElement(tmp); 175 174 return tmp; … … 180 179 181 180 /******************** Access to iterators ****************************/ 182 periodentafel::const_iterator periodentafel::begin() {181 periodentafel::const_iterator periodentafel::begin() const{ 183 182 return elements.begin(); 184 183 } 185 184 186 periodentafel::const_iterator periodentafel::end() {185 periodentafel::const_iterator periodentafel::end() const{ 187 186 return elements.end(); 188 187 } 189 188 190 periodentafel::reverse_iterator periodentafel::rbegin() {189 periodentafel::reverse_iterator periodentafel::rbegin() const{ 191 190 return reverse_iterator(elements.end()); 192 191 } 193 192 194 periodentafel::reverse_iterator periodentafel::rend() {193 periodentafel::reverse_iterator periodentafel::rend() const{ 195 194 return reverse_iterator(elements.begin()); 196 195 } … … 228 227 if (!input.fail()) 229 228 DoLog(0) && (Log() << Verbose(0) << "Using " << filename << " as elements database." << endl); 230 status = status && LoadElementsDatabase( &input);229 status = status && LoadElementsDatabase(input); 231 230 input.close(); 232 231 input.clear(); … … 287 286 * \return true - parsing successful, false - something went wrong 288 287 */ 289 bool periodentafel::LoadElementsDatabase(istream *input)288 bool periodentafel::LoadElementsDatabase(istream &input) 290 289 { 291 290 bool status = true; 292 int counter = 0; 293 pair< std::map<atomicNumber_t,element*>::iterator, bool > InserterTest; 294 if (!(*input).fail()) { 295 (*input).getline(header1, MAXSTRINGSIZE); 296 (*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; 297 299 DoLog(0) && (Log() << Verbose(0) << "Parsed elements:"); 298 while (! (*input).eof()) {300 while (!input.eof()) { 299 301 element *neues = new element; 300 (*input) >> neues->name;301 //(*input) >> ws; 302 (*input) >> neues->symbol;303 //(*input) >> ws; 304 (*input)>> neues->period;305 //(*input) >> ws; 306 (*input)>> neues->group;307 //(*input) >> ws; 308 (*input)>> neues->block;309 //(*input) >> ws; 310 (*input)>> neues->Z;311 //(*input) >> ws; 312 (*input)>> neues->mass;313 //(*input) >> ws; 314 (*input)>> neues->CovalentRadius;315 //(*input) >> ws; 316 (*input)>> neues->VanDerWaalsRadius;317 //(*input) >> ws; 318 (*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; 319 321 //neues->Output((ofstream *)&cout); 320 322 if ((neues->getNumber() > 0) && (neues->getNumber() < MAX_ELEMENTS)) { 321 if (elements.count(neues->getNumber())) {// if element already present, remove and delete old one (i.e. replace it) 322 //cout << neues->symbol << " is present already." << endl; 323 element * const Elemental = FindElement(neues->getNumber()); 324 ASSERT(Elemental != NULL, "element should be present but is not??"); 325 *Elemental = *neues; 326 delete(neues); 327 neues = Elemental; 328 } else { 329 InserterTest = elements.insert(pair <atomicNumber_t,element*> (neues->getNumber(), neues)); 330 ASSERT(InserterTest.second, "Could not insert new element into periodentafel on LoadElementsDatabase()."); 331 } 332 DoLog(0) && (Log() << Verbose(0) << " " << elements[neues->getNumber()]->symbol); 333 counter++; 323 parsedElements[neues->Z] = neues; 324 DoLog(0) && (Log() << Verbose(0) << " " << *neues); 334 325 } else { 335 326 DoeLog(2) && (eLog() << Verbose(2) << "Detected empty line or invalid element in elements db, discarding." << endl); … … 337 328 delete(neues); 338 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 } 339 336 } 340 337 DoLog(0) && (Log() << Verbose(0) << endl); … … 344 341 } 345 342 346 if ( counter == 0)343 if (!parsedElements.size()) 347 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 } 348 366 349 367 return status;
Note:
See TracChangeset
for help on using the changeset viewer.
