Ignore:
Timestamp:
Mar 12, 2010, 1:16:01 PM (15 years ago)
Author:
Tillmann Crueger <crueger@…>
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:
745a85
Parents:
c3dbe0
Message:

Made the periodentafel use STL-containers instead of custom llists

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/periodentafel.cpp

    rc3dbe0 read4e6  
    1010#include <fstream>
    1111#include <cstring>
     12#include <cassert>
    1213
    1314#include "element.hpp"
     
    1819#include "verbose.hpp"
    1920
     21using namespace std;
     22
    2023/************************************* Functions for class periodentafel ***************************/
    2124
     
    2326 * Initialises start and end of list and resets periodentafel::checkliste to false.
    2427 */
    25 periodentafel::periodentafel() : start(new element), end(new element)
    26 {
    27   start->previous = NULL;
    28   start->next = end;
    29   end->previous = start;
    30   end->next = NULL;
    31 };
     28periodentafel::periodentafel()
     29{};
    3230
    3331/** destructor for class periodentafel
     
    3735{
    3836  CleanupPeriodtable();
    39   delete(end);
    40   delete(start);
    4137};
    4238
     
    4541 * \return true - succeeded, false - does not occur
    4642 */
    47 bool periodentafel::AddElement(element * const pointer)
    48 {
     43periodentafel::iterator periodentafel::AddElement(element * const pointer)
     44{
     45  atomicNumber_t Z = pointer->getNumber();
     46  assert(!elements.count(Z));
    4947  pointer->sort = &pointer->Z;
    50   if (pointer->Z < 1 && pointer->Z >= MAX_ELEMENTS)
     48  if (pointer->getNumber() < 1 && pointer->getNumber() >= MAX_ELEMENTS)
    5149    Log() << Verbose(0) << "Invalid Z number!\n";
    52   return add(pointer, end);
     50  pair<iterator,bool> res = elements.insert(pair<atomicNumber_t,element*>(Z,pointer));
     51  return res.first;
    5352};
    5453
     
    5756 * \return true - succeeded, false - element not found
    5857 */
    59 bool periodentafel::RemoveElement(element * const pointer)
    60 {
    61   return remove(pointer, start, end);
     58void periodentafel::RemoveElement(element * const pointer)
     59{
     60  atomicNumber_t Z = pointer->getNumber();
     61  elements.erase(Z);
    6262};
    6363
     
    6565 * \return true - succeeded, false - does not occur
    6666 */
    67 bool periodentafel::CleanupPeriodtable()
    68 {
    69   return cleanup(start,end);
     67void periodentafel::CleanupPeriodtable()
     68{
     69  elements.clear();
    7070};
    7171
     
    7575 * \return pointer to element or NULL if not found
    7676 */
    77 element * const periodentafel::FindElement(const int Z) const
    78 {
    79   element *walker = find(&Z, start,end);
    80   return(walker);
     77const element * periodentafel::FindElement(atomicNumber_t Z) const
     78{
     79  const_iterator res = elements.find(Z);
     80  return res!=elements.end()?((*res).second):0;
    8181};
    8282
     
    8686 * \return pointer to element
    8787 */
    88 element * const periodentafel::FindElement(const char * const shorthand) const
    89 {
    90   element *walker =  periodentafel::start;
    91   while (walker->next != periodentafel::end) {
    92     walker = walker->next;
    93     if (strncmp(walker->symbol, shorthand, 3) == 0)
    94       return(walker);
     88const element * periodentafel::FindElement(const char * const shorthand) const
     89{
     90  element *res = 0;
     91  for(const_iterator iter=elements.begin();iter!=elements.end();++iter) {
     92    if((*iter).second->getSymbol() == shorthand){
     93      res = (*iter).second;
     94      break;
     95    }
    9596  }
    96   return (NULL);
     97  return res;
    9798};
    9899
    99100/** Asks for element number and returns pointer to element
    100101 */
    101 element * const periodentafel::AskElement() const
    102 {
    103   element *walker = NULL;
     102const element * periodentafel::AskElement() const
     103{
     104  const element *walker = NULL;
    104105  int Z;
    105106  do {
     
    114115 * \return pointer to either present or newly created element
    115116 */
    116 element * const periodentafel::EnterElement()
    117 {
    118   element *walker = NULL;
    119   int Z = -1;
     117const element * periodentafel::EnterElement()
     118{
     119  const element *res = NULL;
     120  atomicNumber_t Z = 0;
    120121  Log() << Verbose(0) << "Atomic number: " << Z << endl;
    121122  cin >> Z;
    122   walker = FindElement(Z);
    123   if (walker == NULL) {
     123  res = FindElement(Z);
     124  if (!res) {
     125    // TODO: make this using the constructor
     126    element *tmp;
    124127    Log() << Verbose(0) << "Element not found in database, please enter." << endl;
    125     walker = new element;
    126     walker->Z = Z;
     128    tmp = new element;
     129    tmp->Z = Z;
    127130    Log() << Verbose(0) << "Mass: " << endl;
    128     cin >> walker->mass;
     131    cin >> tmp->mass;
    129132    Log() << Verbose(0) << "Name [max 64 chars]: " << endl;
    130     cin >> walker->name;
     133    cin >> tmp->name;
    131134    Log() << Verbose(0) << "Short form [max 3 chars]: " << endl;
    132     cin >> walker->symbol;
    133     periodentafel::AddElement(walker);
     135    cin >> tmp->symbol;
     136    AddElement(tmp);
     137    res = tmp;
    134138  }
    135   return(walker);
    136 };
     139  return res;
     140};
     141
     142
     143/******************** Access to iterators ****************************/
     144periodentafel::const_iterator periodentafel::begin(){
     145  return elements.begin();
     146}
     147
     148periodentafel::const_iterator periodentafel::end(){
     149  return elements.end();
     150}
     151
     152periodentafel::reverse_iterator periodentafel::rbegin(){
     153  return reverse_iterator(elements.end());
     154}
     155
     156periodentafel::reverse_iterator periodentafel::rend(){
     157  return reverse_iterator(elements.begin());
     158}
    137159
    138160/** Prints period table to given stream.
    139161 * \param output stream
    140162 */
    141 bool periodentafel::Output(ofstream * const output) const
     163bool periodentafel::Output(ostream * const output) const
    142164{
    143165  bool result = true;
    144   element *walker = start;
    145166  if (output != NULL) {
    146     while (walker->next != end) {
    147       walker = walker->next;
    148       result = result && walker->Output(output);
     167    for(const_iterator iter=elements.begin(); iter !=elements.end();++iter){
     168      result = result && (*iter).second->Output(output);
    149169    }
    150170    return result;
     
    157177 * \param *checkliste elements table for this molecule
    158178 */
    159 bool periodentafel::Checkout(ofstream * const output, const int * const checkliste) const
    160 {
    161   element *walker = start;
     179bool periodentafel::Checkout(ostream * const output, const int * const checkliste) const
     180{
    162181  bool result = true;
    163182  int No = 1;
     
    166185    *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;
    167186    *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
    168     while (walker->next != end) {
    169       walker = walker->next;
    170       if ((walker != NULL) && (walker->Z > 0) && (walker->Z < MAX_ELEMENTS) && (checkliste[walker->Z])) {
    171         walker->No = No;
    172         result = result && walker->Checkout(output, No++, checkliste[walker->Z]);
     187    for(const_iterator iter=elements.begin(); iter!=elements.end();++iter){
     188      if (((*iter).first < MAX_ELEMENTS) && (checkliste[(*iter).first])) {
     189        (*iter).second->No = No;
     190        result = result && (*iter).second->Checkout(output, No++, checkliste[(*iter).first]);
    173191      }
    174192    }
     
    184202{
    185203  ifstream infile;
    186   double tmp;
    187204  element *ptr;
     205  map<atomicNumber_t,element*> parsedElems;
    188206  bool status = true;
    189207  bool otherstatus = true;
     
    223241      //neues->Output((ofstream *)&cout);
    224242      if ((neues->Z > 0) && (neues->Z < MAX_ELEMENTS))
    225         periodentafel::AddElement(neues);
     243        parsedElems[neues->getNumber()] = neues;
    226244      else {
    227245        Log() << Verbose(0) << "Could not parse element: ";
     
    243261  if (infile != NULL) {
    244262    while (!infile.eof()) {
    245       infile >> tmp;
    246       infile >> ws;
    247       infile >> FindElement((int)tmp)->Valence;
     263      atomicNumber_t Z;
     264      infile >> Z;
     265      infile >> ws;
     266      infile >> parsedElems[Z]->Valence;
    248267      infile >> ws;
    249268      //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->Valence << " valence electrons." << endl;
     
    261280  if (infile != NULL) {
    262281    while (!infile.eof()) {
    263       infile >> tmp;
    264       infile >> ws;
    265       infile >> FindElement((int)tmp)->NoValenceOrbitals;
     282      atomicNumber_t Z;
     283      infile >> Z;
     284      infile >> ws;
     285      infile >> parsedElems[Z]->NoValenceOrbitals;
    266286      infile >> ws;
    267287      //Log() << Verbose(3) << "Element " << (int)tmp << " has " << FindElement((int)tmp)->NoValenceOrbitals << " number of singly occupied valence orbitals." << endl;
     
    279299  if (infile != NULL) {
    280300    while (!infile.eof()) {
    281       infile >> tmp;
    282       ptr = FindElement((int)tmp);
     301      atomicNumber_t Z;
     302      infile >> Z;
     303      ptr = parsedElems[Z];
    283304      infile >> ws;
    284305      infile >> ptr->HBondDistance[0];
     
    300321  if (infile != NULL) {
    301322    while (!infile.eof()) {
    302       infile >> tmp;
    303       ptr = FindElement((int)tmp);
     323      atomicNumber_t Z;
     324      infile >> Z;
     325      ptr = parsedElems[Z];
    304326      infile >> ws;
    305327      infile >> ptr->HBondAngle[0];
     
    313335    otherstatus = false;
    314336
    315   if (!otherstatus)
     337  if (otherstatus){
     338    map<atomicNumber_t,element*>::iterator iter;
     339    for(iter=parsedElems.begin();iter!=parsedElems.end();++iter){
     340      AddElement((*iter).second);
     341    }
     342  }
     343  else{
    316344    eLog() << Verbose(2) << "Something went wrong while parsing the other databases!" << endl;
     345  }
    317346
    318347  return status;
     
    334363    f << header1 << endl;
    335364    f << header2 << endl;
    336     element *walker = periodentafel::start;
    337     while (walker->next != periodentafel::end) {
    338       walker = walker->next;
    339       result = result && walker->Output(&f);
     365    for(const_iterator iter=elements.begin();iter!=elements.end();++iter){
     366         result = result && (*iter).second->Output(&f);
    340367    }
    341368    f.close();
Note: See TracChangeset for help on using the changeset viewer.