Changeset 389cc8


Ignore:
Timestamp:
Jul 21, 2010, 1:09:30 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:
574ddc1
Parents:
6f43ab
Message:

Used the formual class instead of single variables inside molecule

Location:
src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/config.cpp

    r6f43ab r389cc8  
    10311031{
    10321032  bool result = true;
    1033   // bring MaxTypes up to date
    1034   mol->CountElements();
    10351033  const Matrix &domain = World::getInstance().getDomain().getM();
    10361034  ofstream * const output = new ofstream(filename, ios::out);
     
    11381136    *output << "IsAngstroem\t" << config::IsAngstroem << "\t# 0 - Bohr, 1 - Angstroem" << endl;
    11391137    *output << "RelativeCoord\t" << config::RelativeCoord << "\t# whether ion coordinates are relative (1) or absolute (0)" << endl;
    1140     *output << "MaxTypes\t" << mol->ElementCount <<  "\t# maximum number of different ion types" << endl;
     1138    *output << "MaxTypes\t" << mol->getElementCount() <<  "\t# maximum number of different ion types" << endl;
    11411139    *output << endl;
    11421140    result = result && mol->Checkout(output);
     
    15331531    mol->SetNameFromFilename(ConfigFileName);
    15341532    molecules->SimpleMultiMerge(mol, src, N);
    1535     mol->doCountAtoms();
    1536     mol->CountElements();
    15371533    //mol->CalculateOrbitals(*this);
    15381534    delete[](src);
  • src/molecule.cpp

    r6f43ab r389cc8  
    4949molecule::molecule(const periodentafel * const teil) :
    5050  Observable("molecule"),
    51   elemente(teil),  MDSteps(0),  BondCount(0), ElementCount(0), NoNonHydrogen(0), NoNonBonds(0),
     51  elemente(teil),  MDSteps(0),  BondCount(0), NoNonHydrogen(0), NoNonBonds(0),
    5252  NoCyclicBonds(0), BondDistance(0.),  ActiveFlag(false), IndexNr(-1),
    53   formula(this,boost::bind(&molecule::calcFormula,this),"formula"),
    5453  AtomCount(this,boost::bind(&molecule::doCountAtoms,this),"AtomCount"), last_atom(0),  InternalPointer(atoms.begin())
    5554{
    5655
    57   // other stuff
    58   for(int i=MAX_ELEMENTS;i--;)
    59     ElementsInMolecule[i] = 0;
    6056  strcpy(name,World::getInstance().getDefaultName().c_str());
    6157};
     
    10298
    10399const std::string molecule::getFormula(){
    104   return *formula;
     100  return formula.toString();
    105101}
    106102
     
    118114  }
    119115  return sstr.str();
     116}
     117
     118unsigned int molecule::getElementCount(){
     119  return formula.getElementCount();
     120}
     121
     122bool molecule::hasElement(const element *element) const{
     123  return formula.hasElement(element);
     124}
     125
     126bool molecule::hasElement(atomicNumber_t Z) const{
     127  return formula.hasElement(Z);
     128}
     129
     130bool molecule::hasElement(const string &shorthand) const{
     131  return formula.hasElement(shorthand);
    120132}
    121133
     
    210222    pointer->sort = &pointer->nr;
    211223    if (pointer->type != NULL) {
    212       if (ElementsInMolecule[pointer->type->Z] == 0)
    213         ElementCount++;
    214       ElementsInMolecule[pointer->type->Z]++; // increase number of elements
     224      formula += pointer->type;
    215225      if (pointer->type->Z != 1)
    216226        NoNonHydrogen++;
     
    651661
    652662  // copy values
    653   copy->CountElements();
    654663  if (hasBondStructure()) {  // if adjaceny list is present
    655664    copy->BondDistance = BondDistance;
     
    774783  ASSERT(pointer, "Null pointer passed to molecule::RemoveAtom().");
    775784  OBSERVE;
    776   if (ElementsInMolecule[pointer->type->Z] != 0)  { // this would indicate an error
    777     ElementsInMolecule[pointer->type->Z]--;  // decrease number of atom of this element
    778   } else
    779     DoeLog(1) && (eLog()<< Verbose(1) << "Atom " << pointer->getName() << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl);
    780   if (ElementsInMolecule[pointer->type->Z] == 0)  // was last atom of this element?
    781     ElementCount--;
     785  formula-=pointer->type;
    782786  RemoveBonds(pointer);
    783787  erase(pointer);
     
    793797  if (pointer == NULL)
    794798    return false;
    795   if (ElementsInMolecule[pointer->type->Z] != 0)  // this would indicate an error
    796     ElementsInMolecule[pointer->type->Z]--; // decrease number of atom of this element
    797   else
    798     DoeLog(1) && (eLog()<< Verbose(1) << "Atom " << pointer->getName() << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl);
    799   if (ElementsInMolecule[pointer->type->Z] == 0)  // was last atom of this element?
    800     ElementCount--;
     799  formula-=pointer->type;
    801800  erase(pointer);
    802801  return true;
     
    871870{
    872871  int ElementNo[MAX_ELEMENTS], AtomNo[MAX_ELEMENTS];
    873   CountElements();
    874872
    875873  for (int i=0;i<MAX_ELEMENTS;++i) {
     
    898896{
    899897  int ElementNo[MAX_ELEMENTS], AtomNo[MAX_ELEMENTS];
    900   CountElements();
    901898
    902899  if (output == NULL) {
     
    940937bool molecule::Checkout(ofstream * const output)  const
    941938{
    942   return elemente->Checkout(output, ElementsInMolecule);
     939  return formula.checkOut(output);
    943940};
    944941
     
    998995};
    999996
    1000 /** Brings molecule::ElementCount and molecule::ElementsInMolecule up-to-date.
    1001  */
    1002 void molecule::CountElements()
    1003 {
    1004   for(int i=MAX_ELEMENTS;i--;)
    1005     ElementsInMolecule[i] = 0;
    1006   ElementCount = 0;
    1007 
    1008   SetIndexedArrayForEachAtomTo ( ElementsInMolecule, &element::Z, &Increment, 1);
    1009 
    1010   for(int i=MAX_ELEMENTS;i--;)
    1011     ElementCount += (ElementsInMolecule[i] != 0 ? 1 : 0);
    1012 };
    1013 
    1014997/** Determines whether two molecules actually contain the same atoms and coordination.
    1015998 * \param *out output stream for debugging
     
    10301013  /// first count both their atoms and elements and update lists thereby ...
    10311014  //Log() << Verbose(0) << "Counting atoms, updating list" << endl;
    1032   CountElements();
    1033   OtherMolecule->CountElements();
    10341015
    10351016  /// ... and compare:
     
    10411022    } else Log() << Verbose(4) << "AtomCounts match: " << getAtomCount() << " == " << OtherMolecule->getAtomCount() << endl;
    10421023  }
    1043   /// -# ElementCount
     1024  /// -# Formula
    10441025  if (result) {
    1045     if (ElementCount != OtherMolecule->ElementCount) {
    1046       DoLog(4) && (Log() << Verbose(4) << "ElementCount don't match: " << ElementCount << " == " << OtherMolecule->ElementCount << endl);
     1026    if (formula != OtherMolecule->formula) {
     1027      DoLog(4) && (Log() << Verbose(4) << "Formulas don't match: " << formula << " == " << OtherMolecule->formula << endl);
    10471028      result = false;
    1048     } else Log() << Verbose(4) << "ElementCount match: " << ElementCount << " == " << OtherMolecule->ElementCount << endl;
    1049   }
    1050   /// -# ElementsInMolecule
    1051   if (result) {
    1052     for (flag=MAX_ELEMENTS;flag--;) {
    1053       //Log() << Verbose(5) << "Element " <<  flag << ": " << ElementsInMolecule[flag] << " <-> " << OtherMolecule->ElementsInMolecule[flag] << "." << endl;
    1054       if (ElementsInMolecule[flag] != OtherMolecule->ElementsInMolecule[flag])
    1055         break;
    1056     }
    1057     if (flag < MAX_ELEMENTS) {
    1058       DoLog(4) && (Log() << Verbose(4) << "ElementsInMolecule don't match." << endl);
    1059       result = false;
    1060     } else Log() << Verbose(4) << "ElementsInMolecule match." << endl;
     1029    } else Log() << Verbose(4) << "Formulas match: " << formula << " == " << OtherMolecule->formula << endl;
    10611030  }
    10621031  /// then determine and compare center of gravity for each molecule ...
  • src/molecule.hpp

    r6f43ab r389cc8  
    2828#include "Patterns/ObservedIterator.hpp"
    2929#include "Patterns/Cacheable.hpp"
     30#include "Formula.hpp"
    3031
    3132#include "Descriptors/MoleculeDescriptor_impl.hpp"
     
    9798    //int AtomCount;          //!< number of atoms, brought up-to-date by CountAtoms()
    9899    int BondCount;          //!< number of atoms, brought up-to-date by CountBonds()
    99     int ElementCount;       //!< how many unique elements are therein
    100     int ElementsInMolecule[MAX_ELEMENTS]; //!< list whether element (sorted by atomic number) is alread present or not
    101100    mutable int NoNonHydrogen;  //!< number of non-hydrogen atoms in molecule
    102101    mutable int NoNonBonds;     //!< number of non-hydrogen bonds in molecule
     
    109108
    110109  private:
    111     Cacheable<string> formula;
     110    Formula formula;
    112111    Cacheable<int>    AtomCount;
    113112    moleculeId_t id;
     
    137136  const std::string getFormula();
    138137  std::string calcFormula();
     138  unsigned int getElementCount();
     139  bool hasElement(const element*) const;
     140  bool hasElement(atomicNumber_t) const;
     141  bool hasElement(const std::string&) const;
     142
    139143
    140144  iterator begin();
     
    254258
    255259  /// Count and change present atoms' coordination.
    256   void CountElements();
    257260  bool CenterInBox();
    258261  bool BoundInBox();
  • src/molecule_dynamics.cpp

    r6f43ab r389cc8  
    560560  ForceMatrix Force;
    561561
    562   CountElements();  // make sure ElementsInMolecule is up to date
    563 
    564562  const int AtomCount = getAtomCount();
    565563  // check file
  • src/moleculelist.cpp

    r6f43ab r389cc8  
    597597      periodentafel::const_iterator elemIter;
    598598      for(elemIter=periode->begin();elemIter!=periode->end();++elemIter){
    599         if ((*ListRunner)->ElementsInMolecule[(*elemIter).first]) { // if this element got atoms
     599        if ((*ListRunner)->hasElement((*elemIter).first)) { // if this element got atoms
    600600          for(molecule::iterator atomIter = (*ListRunner)->begin(); atomIter !=(*ListRunner)->end();++atomIter){
    601601            if ((*atomIter)->type->getNumber() == (*elemIter).first) {
     
    689689
    690690    // also calculate necessary orbitals
    691     (*ListRunner)->CountElements(); // this is a bugfix, atoms should shoulds actually be added correctly to this fragment
    692691    //(*ListRunner)->CalculateOrbitals(*World::getInstance().getConfig);
    693692
  • src/periodentafel.cpp

    r6f43ab r389cc8  
    205205    for(const_iterator iter=elements.begin(); iter !=elements.end();++iter){
    206206      result = result && (*iter).second->Output(output);
    207     }
    208     return result;
    209   } else
    210     return false;
    211 };
    212 
    213 /** Prints period table to given stream.
    214  * \param *output output stream
    215  * \param *checkliste elements table for this molecule
    216  */
    217 bool periodentafel::Checkout(ostream * const output, const int * const checkliste) const
    218 {
    219   bool result = true;
    220   int No = 1;
    221 
    222   if (output != NULL) {
    223     *output << "# Ion type data (PP = PseudoPotential, Z = atomic number)" << endl;
    224     *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
    225     for(const_iterator iter=elements.begin(); iter!=elements.end();++iter){
    226       if (((*iter).first < MAX_ELEMENTS) && (checkliste[(*iter).first])) {
    227         (*iter).second->No = No;
    228         result = result && (*iter).second->Checkout(output, No++, checkliste[(*iter).first]);
    229       }
    230207    }
    231208    return result;
  • src/periodentafel.hpp

    r6f43ab r389cc8  
    5757  reverse_iterator rend();
    5858  bool Output(std::ostream * const output) const;
    59   bool Checkout(std::ostream * const output, const int * const checkliste) const;
    6059  bool LoadPeriodentafel(const char * const path);
    6160  bool StorePeriodentafel(const char * const path) const;
Note: See TracChangeset for help on using the changeset viewer.