Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/molecules.cpp

    • Property mode changed from 100755 to 100644
    r848729 rf5d7e1  
    11/** \file molecules.cpp
    2  *
     2 * 
    33 * Functions for the class molecule.
    4  *
     4 * 
    55 */
    66
     
    2525      sum += (gsl_vector_get(x,j) - (vectors[i])->x[j])*(gsl_vector_get(x,j) - (vectors[i])->x[j]);
    2626  }
    27 
     27 
    2828  return sum;
    2929};
     
    3434 * Initialises molecule list with correctly referenced start and end, and sets molecule::last_atom to zero.
    3535 */
    36 molecule::molecule(periodentafel *teil)
    37 {
     36molecule::molecule(periodentafel *teil) 
     37{ 
    3838  // init atom chain list
    39   start = new atom;
     39  start = new atom; 
    4040  end = new atom;
    41   start->father = NULL;
     41  start->father = NULL; 
    4242  end->father = NULL;
    4343  link(start,end);
     
    4646  last = new bond(start, end, 1, -1);
    4747  link(first,last);
    48   // other stuff
     48  // other stuff 
    4949  MDSteps = 0;
    50   last_atom = 0;
     50  last_atom = 0; 
    5151  elemente = teil;
    5252  AtomCount = 0;
     
    6767 * Initialises molecule list with correctly referenced start and end, and sets molecule::last_atom to zero.
    6868 */
    69 molecule::~molecule()
     69molecule::~molecule() 
    7070{
    7171  if (ListOfBondsPerAtom != NULL)
     
    7878  delete(last);
    7979  delete(end);
    80   delete(start);
     80  delete(start); 
    8181};
    8282
    8383/** Adds given atom \a *pointer from molecule list.
    84  * Increases molecule::last_atom and gives last number to added atom and names it according to its element::abbrev and molecule::AtomCount
     84 * Increases molecule::last_atom and gives last number to added atom and names it according to its element::abbrev and molecule::AtomCount 
    8585 * \param *pointer allocated and set atom
    8686 * \return true - succeeded, false - atom not found in list
    8787 */
    8888bool molecule::AddAtom(atom *pointer)
    89 {
     89{ 
    9090  if (pointer != NULL) {
    91     pointer->sort = &pointer->nr;
     91    pointer->sort = &pointer->nr; 
    9292    pointer->nr = last_atom++;  // increase number within molecule
    9393    AtomCount++;
     
    106106    return add(pointer, end);
    107107  } else
    108     return false;
     108    return false; 
    109109};
    110110
     
    115115 */
    116116atom * molecule::AddCopyAtom(atom *pointer)
    117 {
     117{ 
    118118  if (pointer != NULL) {
    119119        atom *walker = new atom();
     
    122122    walker->v.CopyVector(&pointer->v); // copy velocity
    123123    walker->FixedIon = pointer->FixedIon;
    124     walker->sort = &walker->nr;
     124    walker->sort = &walker->nr; 
    125125    walker->nr = last_atom++;  // increase number within molecule
    126126    walker->father = pointer; //->GetTrueFather();
     
    133133    return walker;
    134134  } else
    135     return NULL;
     135    return NULL; 
    136136};
    137137
     
    156156 *    The lengths for these are \f$f\f$ and \f$g\f$ (from triangle H1-H2-(center of H1-H2-H3)) with knowledge that
    157157 *    the median lines in an isosceles triangle meet in the center point with a ratio 2:1.
    158  *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2}
     158 *    \f[ f = \frac{b}{\sqrt{3}} \qquad g = \frac{b}{2} 
    159159 *    \f]
    160  *    as the coordination of all three atoms in the coordinate system of these three vectors:
     160 *    as the coordination of all three atoms in the coordinate system of these three vectors: 
    161161 *    \f$\pmatrix{d & f & 0}\f$, \f$\pmatrix{d & -0.5 \cdot f & g}\f$ and \f$\pmatrix{d & -0.5 \cdot f & -g}\f$.
    162  *
     162 * 
    163163 * \param *out output stream for debugging
    164  * \param *Bond pointer to bond between \a *origin and \a *replacement
    165  * \param *TopOrigin son of \a *origin of upper level molecule (the atom added to this molecule as a copy of \a *origin)
     164 * \param *Bond pointer to bond between \a *origin and \a *replacement 
     165 * \param *TopOrigin son of \a *origin of upper level molecule (the atom added to this molecule as a copy of \a *origin) 
    166166 * \param *origin pointer to atom which acts as the origin for scaling the added hydrogen to correct bond length
    167167 * \param *replacement pointer to the atom which shall be copied as a hydrogen atom in this molecule
     
    191191  InBondvector.SubtractVector(&TopOrigin->x);
    192192  bondlength = InBondvector.Norm();
    193 
     193   
    194194   // is greater than typical bond distance? Then we have to correct periodically
    195195   // the problem is not the H being out of the box, but InBondvector have the wrong direction
    196    // due to TopReplacement or Origin being on the wrong side!
    197   if (bondlength > BondDistance) {
     196   // due to TopReplacement or Origin being on the wrong side! 
     197  if (bondlength > BondDistance) { 
    198198//    *out << Verbose(4) << "InBondvector is: ";
    199199//    InBondvector.Output(out);
     
    215215//    *out << endl;
    216216  } // periodic correction finished
    217 
     217 
    218218  InBondvector.Normalize();
    219219  // get typical bond length and store as scale factor for later
     
    222222    cerr << Verbose(3) << "ERROR: There is no typical hydrogen bond distance in replacing bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") of degree " << TopBond->BondDegree << "!" << endl;
    223223    return false;
    224     BondRescale = bondlength;
     224    BondRescale = bondlength; 
    225225  } else {
    226226    if (!IsAngstroem)
     
    273273      if (FirstOtherAtom != NULL) { // then we just have this double bond and the plane does not matter at all
    274274//        *out << Verbose(3) << "Regarding the double bond (" << TopOrigin->Name << "<->" << TopReplacement->Name << ") to be constructed: Taking " << FirstOtherAtom->Name << " and " << SecondOtherAtom->Name << " along with " << TopOrigin->Name << " to determine orthogonal plane." << endl;
    275 
     275       
    276276        // determine the plane of these two with the *origin
    277277        AllWentWell = AllWentWell && Orthovector1.MakeNormalVector(&TopOrigin->x, &FirstOtherAtom->x, &SecondOtherAtom->x);
     
    286286      Orthovector1.Normalize();
    287287      //*out << Verbose(3) << "ReScaleCheck: " << Orthovector1.Norm() << " and " << InBondvector.Norm() << "." << endl;
    288 
     288     
    289289      // create the two Hydrogens ...
    290290      FirstOtherAtom = new atom();
     
    318318        SecondOtherAtom->x.x[i] = InBondvector.x[i] * cos(bondangle) + Orthovector1.x[i] * (-sin(bondangle));
    319319      }
    320       FirstOtherAtom->x.Scale(&BondRescale);  // rescale by correct BondDistance
     320      FirstOtherAtom->x.Scale(&BondRescale);  // rescale by correct BondDistance 
    321321      SecondOtherAtom->x.Scale(&BondRescale);
    322322      //*out << Verbose(3) << "ReScaleCheck: " << FirstOtherAtom->x.Norm() << " and " << SecondOtherAtom->x.Norm() << "." << endl;
    323323      for(int i=NDIM;i--;) { // and make relative to origin atom
    324         FirstOtherAtom->x.x[i] += TopOrigin->x.x[i];
     324        FirstOtherAtom->x.x[i] += TopOrigin->x.x[i]; 
    325325        SecondOtherAtom->x.x[i] += TopOrigin->x.x[i];
    326326      }
     
    365365//      *out << endl;
    366366      AllWentWell = AllWentWell && Orthovector2.MakeNormalVector(&InBondvector, &Orthovector1);
    367 //      *out << Verbose(3) << "Orthovector2: ";
     367//      *out << Verbose(3) << "Orthovector2: "; 
    368368//      Orthovector2.Output(out);
    369369//      *out << endl;
    370 
     370     
    371371      // create correct coordination for the three atoms
    372372      alpha = (TopOrigin->type->HBondAngle[2])/180.*M_PI/2.;  // retrieve triple bond angle from database
     
    380380      factors[0] = d;
    381381      factors[1] = f;
    382       factors[2] = 0.;
     382      factors[2] = 0.; 
    383383      FirstOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    384384      factors[1] = -0.5*f;
    385       factors[2] = g;
     385      factors[2] = g; 
    386386      SecondOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    387       factors[2] = -g;
     387      factors[2] = -g; 
    388388      ThirdOtherAtom->x.LinearCombinationOfVectors(&InBondvector, &Orthovector1, &Orthovector2, factors);
    389389
     
    437437 */
    438438bool molecule::AddXYZFile(string filename)
    439 {
     439{ 
    440440  istringstream *input = NULL;
    441441  int NumberOfAtoms = 0; // atom number in xyz read
     
    446446  string line;    // currently parsed line
    447447  double x[3];    // atom coordinates
    448 
     448 
    449449  xyzfile.open(filename.c_str());
    450450  if (!xyzfile)
     
    454454  input = new istringstream(line);
    455455  *input >> NumberOfAtoms;
    456   cout << Verbose(0) << "Parsing " << NumberOfAtoms << " atoms in file." << endl;
     456  cout << Verbose(0) << "Parsing " << NumberOfAtoms << " atoms in file." << endl; 
    457457  getline(xyzfile,line,'\n'); // Read comment
    458458  cout << Verbose(1) << "Comment: " << line << endl;
    459 
     459 
    460460  if (MDSteps == 0) // no atoms yet present
    461461    MDSteps++;
     
    491491  xyzfile.close();
    492492  delete(input);
    493   return true;
     493  return true; 
    494494};
    495495
     
    503503  atom *LeftAtom = NULL, *RightAtom = NULL;
    504504  atom *Walker = NULL;
    505 
     505 
    506506  // copy all atoms
    507507  Walker = start;
     
    510510    CurrentAtom = copy->AddCopyAtom(Walker);
    511511  }
    512 
     512 
    513513  // copy all bonds
    514514  bond *Binder = first;
     
    534534      copy->NoCyclicBonds++;
    535535    NewBond->Type = Binder->Type;
    536   }
     536  } 
    537537  // correct fathers
    538538  Walker = copy->start;
     
    551551    copy->CreateListOfBondsPerAtom((ofstream *)&cout);
    552552  }
    553 
     553 
    554554  return copy;
    555555};
     
    576576
    577577/** Remove bond from bond chain list.
    578  * \todo Function not implemented yet
     578 * \todo Function not implemented yet 
    579579 * \param *pointer bond pointer
    580580 * \return true - bound found and removed, false - bond not found/removed
     
    588588
    589589/** Remove every bond from bond chain list that atom \a *BondPartner is a constituent of.
    590  * \todo Function not implemented yet
     590 * \todo Function not implemented yet 
    591591 * \param *BondPartner atom to be removed
    592592 * \return true - bounds found and removed, false - bonds not found/removed
     
    621621  Vector *min = new Vector;
    622622  Vector *max = new Vector;
    623 
     623 
    624624  // gather min and max for each axis
    625625  ptr = start->next;  // start at first in list
     
    667667{
    668668  Vector *min = new Vector;
    669 
     669 
    670670//  *out << Verbose(3) << "Begin of CenterEdge." << endl;
    671671  atom *ptr = start->next;  // start at first in list
     
    683683      }
    684684    }
    685 //    *out << Verbose(4) << "Maximum is ";
     685//    *out << Verbose(4) << "Maximum is "; 
    686686//    max->Output(out);
    687687//    *out << ", Minimum is ";
     
    691691    max->AddVector(min);
    692692    Translate(min);
    693   }
     693  } 
    694694  delete(min);
    695695//  *out << Verbose(3) << "End of CenterEdge." << endl;
    696 };
     696}; 
    697697
    698698/** Centers the center of the atoms at (0,0,0).
     
    704704  int Num = 0;
    705705  atom *ptr = start->next;  // start at first in list
    706 
     706 
    707707  for(int i=NDIM;i--;) // zero center vector
    708708    center->x[i] = 0.;
    709 
     709   
    710710  if (ptr != end) {   //list not empty?
    711711    while (ptr->next != end) {  // continue with second if present
    712712      ptr = ptr->next;
    713713      Num++;
    714       center->AddVector(&ptr->x);
     714      center->AddVector(&ptr->x);       
    715715    }
    716716    center->Scale(-1./Num); // divide through total number (and sign for direction)
    717717    Translate(center);
    718718  }
    719 };
     719}; 
    720720
    721721/** Returns vector pointing to center of gravity.
     
    729729  Vector tmp;
    730730  double Num = 0;
    731 
     731 
    732732  a->Zero();
    733733
     
    737737      Num += 1.;
    738738      tmp.CopyVector(&ptr->x);
    739       a->AddVector(&tmp);
     739      a->AddVector(&tmp);       
    740740    }
    741741    a->Scale(-1./Num); // divide through total mass (and sign for direction)
     
    757757        Vector tmp;
    758758  double Num = 0;
    759 
     759       
    760760        a->Zero();
    761761
     
    766766      tmp.CopyVector(&ptr->x);
    767767      tmp.Scale(ptr->type->mass);  // scale by mass
    768       a->AddVector(&tmp);
     768      a->AddVector(&tmp);       
    769769    }
    770770    a->Scale(-1./Num); // divide through total mass (and sign for direction)
     
    789789    Translate(center);
    790790  }
    791 };
     791}; 
    792792
    793793/** Scales all atoms by \a *factor.
     
    803803      Trajectories[ptr].R.at(j).Scale(factor);
    804804    ptr->x.Scale(factor);
    805   }
    806 };
    807 
    808 /** Translate all atoms by given vector.
     805  }     
     806};
     807
     808/** Translate all atoms by given vector. 
    809809 * \param trans[] translation vector.
    810810 */
     
    818818      Trajectories[ptr].R.at(j).Translate(trans);
    819819    ptr->x.Translate(trans);
    820   }
    821 };
    822 
    823 /** Mirrors all atoms against a given plane.
     820  }     
     821};
     822
     823/** Mirrors all atoms against a given plane. 
    824824 * \param n[] normal vector of mirror plane.
    825825 */
     
    833833      Trajectories[ptr].R.at(j).Mirror(n);
    834834    ptr->x.Mirror(n);
    835   }
     835  }     
    836836};
    837837
     
    847847  bool flag;
    848848  Vector Testvector, Translationvector;
    849 
     849 
    850850  do {
    851851    Center.Zero();
     
    863863          if (Walker->nr < Binder->GetOtherAtom(Walker)->nr) // otherwise we shift one to, the other fro and gain nothing
    864864            for (int j=0;j<NDIM;j++) {
    865               tmp = Walker->x.x[j] - Binder->GetOtherAtom(Walker)->x.x[j];
     865              tmp = Walker->x.x[j] - Binder->GetOtherAtom(Walker)->x.x[j]; 
    866866              if ((fabs(tmp)) > BondDistance) {
    867867                flag = false;
     
    879879        cout << Verbose(1) << "vector is: ";
    880880        Testvector.Output((ofstream *)&cout);
    881         cout << endl;
     881        cout << endl;     
    882882#ifdef ADDHYDROGEN
    883883        // now also change all hydrogens
     
    892892            cout << Verbose(1) << "Hydrogen vector is: ";
    893893            Testvector.Output((ofstream *)&cout);
    894             cout << endl;
     894            cout << endl;     
    895895          }
    896896        }
     
    914914
    915915        CenterGravity(out, CenterOfGravity);
    916 
    917         // reset inertia tensor
     916       
     917        // reset inertia tensor 
    918918        for(int i=0;i<NDIM*NDIM;i++)
    919919                InertiaTensor[i] = 0.;
    920 
     920       
    921921        // sum up inertia tensor
    922922        while (ptr->next != end) {
     
    943943        }
    944944        *out << endl;
    945 
     945       
    946946        // diagonalize to determine principal axis system
    947947        gsl_eigen_symmv_workspace *T = gsl_eigen_symmv_alloc(NDIM);
     
    952952        gsl_eigen_symmv_free(T);
    953953        gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC);
    954 
     954       
    955955        for(int i=0;i<NDIM;i++) {
    956956                *out << Verbose(1) << "eigenvalue = " << gsl_vector_get(eval, i);
    957957                *out << ", eigenvector = (" << evec->data[i * evec->tda + 0] << "," << evec->data[i * evec->tda + 1] << "," << evec->data[i * evec->tda + 2] << ")" << endl;
    958958        }
    959 
     959       
    960960        // check whether we rotate or not
    961961        if (DoRotate) {
    962           *out << Verbose(1) << "Transforming molecule into PAS ... ";
     962          *out << Verbose(1) << "Transforming molecule into PAS ... "; 
    963963          // the eigenvectors specify the transformation matrix
    964964          ptr = start;
     
    972972
    973973          // summing anew for debugging (resulting matrix has to be diagonal!)
    974           // reset inertia tensor
     974          // reset inertia tensor 
    975975    for(int i=0;i<NDIM*NDIM;i++)
    976976      InertiaTensor[i] = 0.;
    977 
     977   
    978978    // sum up inertia tensor
    979979    ptr = start;
     
    10021002    *out << endl;
    10031003        }
    1004 
     1004       
    10051005        // free everything
    10061006        delete(CenterOfGravity);
     
    10311031
    10321032  CountElements();  // make sure ElementsInMolecule is up to date
    1033 
     1033 
    10341034  // check file
    10351035  if (input == NULL) {
     
    10871087              Trajectories[walker].U.at(MDSteps).x[d] += 0.5*delta_t*(Trajectories[walker].F.at(MDSteps-1).x[d]+Trajectories[walker].F.at(MDSteps).x[d])/IonMass;
    10881088            }
    1089 //            cout << "Integrated position&velocity of step " << (MDSteps) << ": (";
     1089//            cout << "Integrated position&velocity of step " << (MDSteps) << ": ("; 
    10901090//            for (int d=0;d<NDIM;d++)
    10911091//              cout << Trajectories[walker].R.at(MDSteps).x[d] << " ";          // next step
     
    11211121  MDSteps++;
    11221122
    1123 
     1123 
    11241124  // exit
    11251125  return true;
    11261126};
    11271127
    1128 /** Align all atoms in such a manner that given vector \a *n is along z axis.
     1128/** Align all atoms in such a manner that given vector \a *n is along z axis. 
    11291129 * \param n[] alignment vector.
    11301130 */
     
    11451145    ptr = ptr->next;
    11461146    tmp = ptr->x.x[0];
    1147     ptr->x.x[0] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2];
     1147    ptr->x.x[0] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2]; 
    11481148    ptr->x.x[2] = -sin(alpha) * tmp + cos(alpha) * ptr->x.x[2];
    11491149    for (int j=0;j<MDSteps;j++) {
    11501150      tmp = Trajectories[ptr].R.at(j).x[0];
    1151       Trajectories[ptr].R.at(j).x[0] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2];
     1151      Trajectories[ptr].R.at(j).x[0] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2]; 
    11521152      Trajectories[ptr].R.at(j).x[2] = -sin(alpha) * tmp + cos(alpha) * Trajectories[ptr].R.at(j).x[2];
    11531153    }
    1154   }
     1154  }     
    11551155  // rotate n vector
    11561156  tmp = n->x[0];
     
    11601160  n->Output((ofstream *)&cout);
    11611161  cout << endl;
    1162 
     1162 
    11631163  // rotate on z-y plane
    11641164  ptr = start;
     
    11681168    ptr = ptr->next;
    11691169    tmp = ptr->x.x[1];
    1170     ptr->x.x[1] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2];
     1170    ptr->x.x[1] =  cos(alpha) * tmp + sin(alpha) * ptr->x.x[2]; 
    11711171    ptr->x.x[2] = -sin(alpha) * tmp + cos(alpha) * ptr->x.x[2];
    11721172    for (int j=0;j<MDSteps;j++) {
    11731173      tmp = Trajectories[ptr].R.at(j).x[1];
    1174       Trajectories[ptr].R.at(j).x[1] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2];
     1174      Trajectories[ptr].R.at(j).x[1] =  cos(alpha) * tmp + sin(alpha) * Trajectories[ptr].R.at(j).x[2]; 
    11751175      Trajectories[ptr].R.at(j).x[2] = -sin(alpha) * tmp + cos(alpha) * Trajectories[ptr].R.at(j).x[2];
    11761176    }
    1177   }
     1177  }     
    11781178  // rotate n vector (for consistency check)
    11791179  tmp = n->x[1];
    11801180  n->x[1] =  cos(alpha) * tmp +  sin(alpha) * n->x[2];
    11811181  n->x[2] = -sin(alpha) * tmp +  cos(alpha) * n->x[2];
    1182 
     1182 
    11831183  cout << Verbose(1) << "alignment vector after second rotation: ";
    11841184  n->Output((ofstream *)&cout);
     
    11911191 * \return true - succeeded, false - atom not found in list
    11921192 */
    1193 bool molecule::RemoveAtom(atom *pointer)
    1194 {
     1193bool molecule::RemoveAtom(atom *pointer) 
     1194{ 
    11951195  if (ElementsInMolecule[pointer->type->Z] != 0)  // this would indicate an error
    11961196    ElementsInMolecule[pointer->type->Z]--;  // decrease number of atom of this element
    11971197  else
    1198     cerr << "ERROR: Atom " << pointer->Name << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl;
     1198    cerr << "ERROR: Atom " << pointer->Name << " is of element " << pointer->type->Z << " but the entry in the table of the molecule is 0!" << endl; 
    11991199  if (ElementsInMolecule[pointer->type->Z] == 0)  // was last atom of this element?
    12001200    ElementCount--;
     
    12061206 * \return true - succeeded, false - atom not found in list
    12071207 */
    1208 bool molecule::CleanupMolecule()
    1209 {
    1210   return (cleanup(start,end) && cleanup(first,last));
     1208bool molecule::CleanupMolecule() 
     1209{ 
     1210  return (cleanup(start,end) && cleanup(first,last)); 
    12111211};
    12121212
     
    12221222  } else {
    12231223    cout << Verbose(0) << "Atom not found in list." << endl;
    1224     return NULL;
     1224    return NULL; 
    12251225  }
    12261226};
     
    12711271  struct lsq_params *par = (struct lsq_params *)params;
    12721272  atom *ptr = par->mol->start;
    1273 
     1273 
    12741274  // initialize vectors
    12751275  a.x[0] = gsl_vector_get(x,0);
     
    13011301{
    13021302    int np = 6;
    1303 
     1303   
    13041304   const gsl_multimin_fminimizer_type *T =
    13051305     gsl_multimin_fminimizer_nmsimplex;
     
    13071307   gsl_vector *ss;
    13081308   gsl_multimin_function minex_func;
    1309 
     1309 
    13101310   size_t iter = 0, i;
    13111311   int status;
    13121312   double size;
    1313 
     1313 
    13141314   /* Initial vertex size vector */
    13151315   ss = gsl_vector_alloc (np);
    1316 
     1316 
    13171317   /* Set all step sizes to 1 */
    13181318   gsl_vector_set_all (ss, 1.0);
    1319 
     1319 
    13201320   /* Starting point */
    13211321   par->x = gsl_vector_alloc (np);
    13221322   par->mol = this;
    1323 
     1323 
    13241324   gsl_vector_set (par->x, 0, 0.0);  // offset
    13251325   gsl_vector_set (par->x, 1, 0.0);
     
    13281328   gsl_vector_set (par->x, 4, 0.0);
    13291329   gsl_vector_set (par->x, 5, 1.0);
    1330 
     1330 
    13311331   /* Initialize method and iterate */
    13321332   minex_func.f = &LeastSquareDistance;
    13331333   minex_func.n = np;
    13341334   minex_func.params = (void *)par;
    1335 
     1335 
    13361336   s = gsl_multimin_fminimizer_alloc (T, np);
    13371337   gsl_multimin_fminimizer_set (s, &minex_func, par->x, ss);
    1338 
     1338 
    13391339   do
    13401340     {
    13411341       iter++;
    13421342       status = gsl_multimin_fminimizer_iterate(s);
    1343 
     1343 
    13441344       if (status)
    13451345         break;
    1346 
     1346 
    13471347       size = gsl_multimin_fminimizer_size (s);
    13481348       status = gsl_multimin_test_size (size, 1e-2);
    1349 
     1349 
    13501350       if (status == GSL_SUCCESS)
    13511351         {
    13521352           printf ("converged to minimum at\n");
    13531353         }
    1354 
     1354 
    13551355       printf ("%5d ", (int)iter);
    13561356       for (i = 0; i < (size_t)np; i++)
     
    13611361     }
    13621362   while (status == GSL_CONTINUE && iter < 100);
    1363 
     1363 
    13641364  for (i=0;i<(size_t)np;i++)
    13651365    gsl_vector_set(par->x, i, gsl_vector_get(s->x, i));
     
    13781378  int ElementNo, AtomNo;
    13791379  CountElements();
    1380 
     1380 
    13811381  if (out == NULL) {
    13821382    return false;
     
    14131413  int ElementNo, AtomNo;
    14141414  CountElements();
    1415 
     1415 
    14161416  if (out == NULL) {
    14171417    return false;
     
    14601460  atom *Walker = start;
    14611461  while (Walker->next != end) {
    1462     Walker = Walker->next;
     1462    Walker = Walker->next; 
    14631463#ifdef ADDHYDROGEN
    14641464    if (Walker->type->Z != 1) {   // regard only non-hydrogen
     
    14911491  int No = 0;
    14921492  time_t now;
    1493 
     1493 
    14941494  now = time((time_t *)NULL);   // Get the system time and put it into 'now' as 'calender time'
    14951495  walker = start;
     
    15181518{
    15191519  atom *walker = NULL;
    1520   int AtomNo = 0, ElementNo;
     1520  int No = 0;
    15211521  time_t now;
    1522   element *runner = NULL;
    1523 
     1522 
    15241523  now = time((time_t *)NULL);   // Get the system time and put it into 'now' as 'calender time'
    15251524  walker = start;
    15261525  while (walker->next != end) { // go through every atom and count
    15271526    walker = walker->next;
    1528     AtomNo++;
     1527    No++;
    15291528  }
    15301529  if (out != NULL) {
    1531     *out << AtomNo << "\n\tCreated by molecuilder on " << ctime(&now);
    1532     ElementNo = 0;
    1533     runner = elemente->start;
    1534     while (runner->next != elemente->end) { // go through every element
    1535                 runner = runner->next;
    1536       if (ElementsInMolecule[runner->Z]) { // if this element got atoms
    1537         ElementNo++;
    1538         walker = start;
    1539         while (walker->next != end) { // go through every atom of this element
    1540           walker = walker->next;
    1541           if (walker->type == runner) { // if this atom fits to element
    1542             walker->OutputXYZLine(out);
    1543           }
    1544         }
    1545       }
     1530    *out << No << "\n\tCreated by molecuilder on " << ctime(&now);
     1531    walker = start;
     1532    while (walker->next != end) { // go through every atom of this element
     1533      walker = walker->next;
     1534      walker->OutputXYZLine(out);
    15461535    }
    15471536    return true;
     
    15741563              Walker->nr = i;   // update number in molecule (for easier referencing in FragmentMolecule lateron)
    15751564              if (Walker->type->Z != 1) // count non-hydrogen atoms whilst at it
    1576                 NoNonHydrogen++;
     1565                NoNonHydrogen++; 
    15771566              Free((void **)&Walker->Name, "molecule::CountAtoms: *walker->Name");
    15781567              Walker->Name = (char *) Malloc(sizeof(char)*6, "molecule::CountAtoms: *walker->Name");
     
    15821571            }
    15831572    } else
    1584         *out << Verbose(3) << "AtomCount is still " << AtomCount << ", thus counting nothing." << endl;
     1573        *out << Verbose(3) << "AtomCount is still " << AtomCount << ", thus counting nothing." << endl; 
    15851574  }
    15861575};
     
    15941583        ElementsInMolecule[i] = 0;
    15951584        ElementCount = 0;
    1596 
     1585       
    15971586  atom *walker = start;
    15981587  while (walker->next != end) {
     
    16301619    Binder = Binder->next;
    16311620    if (Binder->Cyclic)
    1632       No++;
     1621      No++;   
    16331622  }
    16341623  delete(BackEdgeStack);
     
    16881677
    16891678/** Creates an adjacency list of the molecule.
    1690  * We obtain an outside file with the indices of atoms which are bondmembers.
    1691  */
    1692 void molecule::CreateAdjacencyList2(ofstream *out, ifstream *input)
    1693 {
    1694 
    1695         // 1 We will parse bonds out of the dbond file created by tremolo.
    1696                         int atom1, atom2, temp;
    1697                         atom *Walker, *OtherWalker;
    1698 
    1699                 if (!input)
    1700                 {
    1701                         cout << Verbose(1) << "Opening silica failed \n";
    1702                 };
    1703 
    1704                         *input >> ws >> atom1;
    1705                         *input >> ws >> atom2;
    1706                 cout << Verbose(1) << "Scanning file\n";
    1707                 while (!input->eof()) // Check whether we read everything already
    1708                 {
    1709                                 *input >> ws >> atom1;
    1710                                 *input >> ws >> atom2;
    1711                         if(atom2<atom1) //Sort indices of atoms in order
    1712                         {
    1713                                 temp=atom1;
    1714                                 atom1=atom2;
    1715                                 atom2=temp;
    1716                         };
    1717 
    1718                         Walker=start;
    1719                         while(Walker-> nr != atom1) // Find atom corresponding to first index
    1720                         {
    1721                                 Walker = Walker->next;
    1722                         };
    1723                         OtherWalker = Walker->next;
    1724                         while(OtherWalker->nr != atom2) // Find atom corresponding to second index
    1725                         {
    1726                                 OtherWalker= OtherWalker->next;
    1727                         };
    1728                         AddBond(Walker, OtherWalker); //Add the bond between the two atoms with respective indices.
    1729                        
    1730                 }
    1731 
    1732                 CreateListOfBondsPerAtom(out);
    1733 
    1734 };
    1735 
    1736 
    1737 /** Creates an adjacency list of the molecule.
    17381679 * Generally, we use the CSD approach to bond recognition, that is the the distance
    17391680 * between two atoms A and B must be within [Rcov(A)+Rcov(B)-t,Rcov(A)+Rcov(B)+t] with
    1740  * a threshold t = 0.4 Angstroem.
     1681 * a threshold t = 0.4 Angstroem. 
    17411682 * To make it O(N log N) the function uses the linked-cell technique as follows:
    17421683 * The procedure is step-wise:
     
    17551696void molecule::CreateAdjacencyList(ofstream *out, double bonddistance, bool IsAngstroem)
    17561697{
    1757 
    17581698  atom *Walker = NULL, *OtherWalker = NULL, *Candidate = NULL;
    17591699  int No, NoBonds, CandidateBondNo;
     
    17641704  Vector x;
    17651705  int FalseBondDegree = 0;
    1766 
     1706 
    17671707  BondDistance = bonddistance; // * ((IsAngstroem) ? 1. : 1./AtomicLengthToAngstroem);
    17681708  *out << Verbose(0) << "Begin of CreateAdjacencyList." << endl;
     
    17711711    cleanup(first,last);
    17721712  }
    1773 
     1713       
    17741714  // count atoms in molecule = dimension of matrix (also give each unique name and continuous numbering)
    17751715  CountAtoms(out);
     
    17901730    for (int i=NumberCells;i--;)
    17911731      CellList[i] = NULL;
    1792 
     1732 
    17931733    // 2b. put all atoms into its corresponding list
    17941734    Walker = start;
     
    18111751      if (CellList[index] == NULL)  // allocate molecule if not done
    18121752        CellList[index] = new molecule(elemente);
    1813       OtherWalker = CellList[index]->AddCopyAtom(Walker); // add a copy of walker to this atom, father will be walker for later reference
    1814       //*out << Verbose(1) << "Copy Atom is " << *OtherWalker << "." << endl;
     1753      OtherWalker = CellList[index]->AddCopyAtom(Walker); // add a copy of walker to this atom, father will be walker for later reference 
     1754      //*out << Verbose(1) << "Copy Atom is " << *OtherWalker << "." << endl; 
    18151755    }
    18161756    //for (int i=0;i<NumberCells;i++)
    18171757      //*out << Verbose(1) << "Cell number " << i << ": " << CellList[i] << "." << endl;
    1818 
    1819 
     1758     
    18201759    // 3a. go through every cell
    18211760    for (N[0]=divisor[0];N[0]--;)
     
    18301769              Walker = Walker->next;
    18311770              //*out << Verbose(0) << "Current Atom is " << *Walker << "." << endl;
    1832               // 3c. check for possible bond between each atom in this and every one in the 27 cells
     1771              // 3c. check for possible bond between each atom in this and every one in the 27 cells 
    18331772              for (n[0]=-1;n[0]<=1;n[0]++)
    18341773                for (n[1]=-1;n[1]<=1;n[1]++)
     
    18621801          }
    18631802        }
    1864 
    1865 
    1866 
    18671803    // 4. free the cell again
    18681804    for (int i=NumberCells;i--;)
     
    18711807      }
    18721808    Free((void **)&CellList, "molecule::CreateAdjacencyList - ** CellList");
    1873 
     1809   
    18741810    // create the adjacency list per atom
    18751811    CreateListOfBondsPerAtom(out);
    1876 
     1812               
    18771813    // correct Bond degree of each bond by checking both bond partners for a mismatch between valence and current sum of bond degrees,
    18781814    // iteratively increase the one first where the other bond partner has the fewest number of bonds (i.e. in general bonds oxygene
     
    19231859                        *out << Verbose(1) << "BondCount is " << BondCount << ", no bonds between any of the " << AtomCount << " atoms." << endl;
    19241860          *out << Verbose(1) << "I detected " << BondCount << " bonds in the molecule with distance " << bonddistance << ", " << FalseBondDegree << " bonds could not be corrected." << endl;
    1925 
     1861               
    19261862          // output bonds for debugging (if bond chain list was correctly installed)
    19271863          *out << Verbose(1) << endl << "From contents of bond chain list:";
     
    19331869    *out << endl;
    19341870  } else
    1935         *out << Verbose(1) << "AtomCount is " << AtomCount << ", thus no bonds, no connections!." << endl;
     1871        *out << Verbose(1) << "AtomCount is " << AtomCount << ", thus no bonds, no connections!." << endl; 
    19361872  *out << Verbose(0) << "End of CreateAdjacencyList." << endl;
    19371873  Free((void **)&matrix, "molecule::CreateAdjacencyList: *matrix");
    1938 
    1939 };
    1940 
    1941 
     1874};
    19421875
    19431876/** Performs a Depth-First search on this molecule.
     
    19601893  bond *Binder = NULL;
    19611894  bool BackStepping = false;
    1962 
     1895 
    19631896  *out << Verbose(0) << "Begin of DepthFirstSearchAnalysis" << endl;
    1964 
     1897 
    19651898  ResetAllBondsToUnused();
    19661899  ResetAllAtomNumbers();
     
    19751908    LeafWalker->Leaf = new molecule(elemente);
    19761909    LeafWalker->Leaf->AddCopyAtom(Root);
    1977 
     1910   
    19781911    OldGraphNr = CurrentGraphNr;
    19791912    Walker = Root;
     
    19861919          AtomStack->Push(Walker);
    19871920          CurrentGraphNr++;
    1988         }
     1921        }     
    19891922        do { // (3) if Walker has no unused egdes, go to (5)
    19901923          BackStepping = false; // reset backstepping flag for (8)
     
    20201953          Binder = NULL;
    20211954      } while (1);  // (2)
    2022 
     1955     
    20231956      // if we came from backstepping, yet there were no more unused bonds, we end up here with no Ancestor, because Walker is Root! Then we are finished!
    20241957      if ((Walker == Root) && (Binder == NULL))
    20251958        break;
    2026 
    2027       // (5) if Ancestor of Walker is ...
     1959       
     1960      // (5) if Ancestor of Walker is ... 
    20281961      *out << Verbose(1) << "(5) Number of Walker[" << Walker->Name << "]'s Ancestor[" << Walker->Ancestor->Name << "] is " << Walker->Ancestor->GraphNr << "." << endl;
    20291962      if (Walker->Ancestor->GraphNr != Root->GraphNr) {
     
    20682001        } while (OtherAtom != Walker);
    20692002        ComponentNumber++;
    2070 
     2003   
    20712004        // (11) Root is separation vertex,  set Walker to Root and go to (4)
    20722005        Walker = Root;
     
    20812014
    20822015    // From OldGraphNr to CurrentGraphNr ranges an disconnected subgraph
    2083     *out << Verbose(0) << "Disconnected subgraph ranges from " << OldGraphNr << " to " << CurrentGraphNr << "." << endl;
     2016    *out << Verbose(0) << "Disconnected subgraph ranges from " << OldGraphNr << " to " << CurrentGraphNr << "." << endl;   
    20842017    LeafWalker->Leaf->Output(out);
    20852018    *out << endl;
     
    20892022      //*out << Verbose(1) << "Current next subgraph root candidate is " << Root->Name << "." << endl;
    20902023      if (Root->GraphNr != -1) // if already discovered, step on
    2091         Root = Root->next;
     2024        Root = Root->next; 
    20922025    }
    20932026  }
     
    21112044    *out << " with Lowpoint " << Walker->LowpointNr << " and Graph Nr. " << Walker->GraphNr << "." << endl;
    21122045  }
    2113 
     2046 
    21142047  *out << Verbose(1) << "Final graph info for each bond is:" << endl;
    21152048  Binder = first;
     
    21222055    *out << ((Binder->rightatom->SeparationVertex) ? "SP," : "") << "L" << Binder->rightatom->LowpointNr << " G" << Binder->rightatom->GraphNr << " Comp.";
    21232056    OutputComponentNumber(out, Binder->rightatom);
    2124     *out << ">." << endl;
     2057    *out << ">." << endl; 
    21252058    if (Binder->Cyclic) // cyclic ??
    21262059      *out << Verbose(3) << "Lowpoint at each side are equal: CYCLIC!" << endl;
     
    21372070 * the other our initial Walker - and do a Breadth First Search for the Root. We mark down each Predecessor and as soon as
    21382071 * we have found the Root via BFS, we may climb back the closed cycle via the Predecessors. Thereby we mark atoms and bonds
    2139  * as cyclic and print out the cycles.
     2072 * as cyclic and print out the cycles. 
    21402073 * \param *out output stream for debugging
    21412074 * \param *BackEdgeStack stack with all back edges found during DFS scan. Beware: This stack contains the bonds from the total molecule, not from the subgraph!
     
    21482081  int *ShortestPathList = (int *) Malloc(sizeof(int)*AtomCount, "molecule::CyclicStructureAnalysis: *ShortestPathList");
    21492082  enum Shading *ColorList = (enum Shading *) Malloc(sizeof(enum Shading)*AtomCount, "molecule::CyclicStructureAnalysis: *ColorList");
    2150   class StackClass<atom *> *BFSStack = new StackClass<atom *> (AtomCount);   // will hold the current ring
     2083  class StackClass<atom *> *BFSStack = new StackClass<atom *> (AtomCount);   // will hold the current ring 
    21512084  class StackClass<atom *> *TouchedStack = new StackClass<atom *> (AtomCount);   // contains all "touched" atoms (that need to be reset after BFS loop)
    21522085  atom *Walker = NULL, *OtherAtom = NULL, *Root = NULL;
     
    21602093    ColorList[i] = white;
    21612094  }
    2162 
     2095 
    21632096  *out << Verbose(1) << "Back edge list - ";
    21642097  BackEdgeStack->Output(out);
    2165 
     2098 
    21662099  *out << Verbose(1) << "Analysing cycles ... " << endl;
    21672100  NumCycles = 0;
     
    21692102    BackEdge = BackEdgeStack->PopFirst();
    21702103    // this is the target
    2171     Root = BackEdge->leftatom;
     2104    Root = BackEdge->leftatom; 
    21722105    // this is the source point
    2173     Walker = BackEdge->rightatom;
     2106    Walker = BackEdge->rightatom; 
    21742107    ShortestPathList[Walker->nr] = 0;
    21752108    BFSStack->ClearStack();  // start with empty BFS stack
     
    21852118        if (Binder != BackEdge) { // only walk along DFS spanning tree (otherwise we always find SP of one being backedge Binder)
    21862119          OtherAtom = Binder->GetOtherAtom(Walker);
    2187 #ifdef ADDHYDROGEN
     2120#ifdef ADDHYDROGEN         
    21882121          if (OtherAtom->type->Z != 1) {
    21892122#endif
     
    21942127              PredecessorList[OtherAtom->nr] = Walker;  // Walker is the predecessor
    21952128              ShortestPathList[OtherAtom->nr] = ShortestPathList[Walker->nr]+1;
    2196               *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " lightgray, its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl;
     2129              *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " lightgray, its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl; 
    21972130              //if (ShortestPathList[OtherAtom->nr] < MinimumRingSize[Walker->GetTrueFather()->nr]) { // Check for maximum distance
    21982131                *out << Verbose(3) << "Putting OtherAtom into queue." << endl;
     
    22042137            if (OtherAtom == Root)
    22052138              break;
    2206 #ifdef ADDHYDROGEN
     2139#ifdef ADDHYDROGEN         
    22072140          } else {
    22082141            *out << Verbose(2) << "Skipping hydrogen atom " << *OtherAtom << "." << endl;
     
    22422175      }
    22432176    } while ((!BFSStack->IsEmpty()) && (OtherAtom != Root) && (OtherAtom != NULL)); // || (ShortestPathList[OtherAtom->nr] < MinimumRingSize[Walker->GetTrueFather()->nr])));
    2244 
     2177   
    22452178    if (OtherAtom == Root) {
    22462179      // now climb back the predecessor list and thus find the cycle members
     
    22702203      *out << Verbose(1) << "No ring containing " << *Root << " with length equal to or smaller than " << MinimumRingSize[Walker->GetTrueFather()->nr] << " found." << endl;
    22712204    }
    2272 
     2205   
    22732206    // now clean the lists
    22742207    while (!TouchedStack->IsEmpty()){
     
    22802213  }
    22812214  if (MinRingSize != -1) {
    2282     // go over all atoms
     2215    // go over all atoms 
    22832216    Root = start;
    22842217    while(Root->next != end) {
    22852218      Root = Root->next;
    2286 
     2219     
    22872220      if (MinimumRingSize[Root->GetTrueFather()->nr] == AtomCount) { // check whether MinimumRingSize is set, if not BFS to next where it is
    22882221        Walker = Root;
     
    23212254          }
    23222255          ColorList[Walker->nr] = black;
    2323           //*out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl;
     2256          //*out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl; 
    23242257        }
    2325 
     2258   
    23262259        // now clean the lists
    23272260        while (!TouchedStack->IsEmpty()){
     
    23722305void molecule::OutputComponentNumber(ofstream *out, atom *vertex)
    23732306{
    2374   for(int i=0;i<NumberOfBondsPerAtom[vertex->nr];i++)
     2307  for(int i=0;i<NumberOfBondsPerAtom[vertex->nr];i++) 
    23752308    *out << vertex->ComponentNr[i] << "  ";
    23762309};
     
    24502383{
    24512384  int c = 0;
    2452   int FragmentCount;
     2385  int FragmentCount; 
    24532386  // get maximum bond degree
    24542387  atom *Walker = start;
     
    24602393  *out << Verbose(1) << "Upper limit for this subgraph is " << FragmentCount << " for " << NoNonHydrogen << " non-H atoms with maximum bond degree of " << c << "." << endl;
    24612394  return FragmentCount;
    2462 };
     2395}; 
    24632396
    24642397/** Scans a single line for number and puts them into \a KeySet.
    24652398 * \param *out output stream for debugging
    24662399 * \param *buffer buffer to scan
    2467  * \param &CurrentSet filled KeySet on return
     2400 * \param &CurrentSet filled KeySet on return 
    24682401 * \return true - at least one valid atom id parsed, false - CurrentSet is empty
    24692402 */
     
    24732406  int AtomNr;
    24742407  int status = 0;
    2475 
     2408 
    24762409  line.str(buffer);
    24772410  while (!line.eof()) {
     
    25092442  double TEFactor;
    25102443  char *filename = (char *) Malloc(sizeof(char)*MAXSTRINGSIZE, "molecule::ParseKeySetFile - filename");
    2511 
     2444 
    25122445  if (FragmentList == NULL) { // check list pointer
    25132446    FragmentList = new Graph;
    25142447  }
    2515 
     2448 
    25162449  // 1st pass: open file and read
    25172450  *out << Verbose(1) << "Parsing the KeySet file ... " << endl;
     
    25422475    status = false;
    25432476  }
    2544 
     2477 
    25452478  // 2nd pass: open TEFactors file and read
    25462479  *out << Verbose(1) << "Parsing the TEFactors file ... " << endl;
     
    25542487        InputFile >> TEFactor;
    25552488        (*runner).second.second = TEFactor;
    2556         *out << Verbose(2) << "Setting " << ++NumberOfFragments << " fragment's TEFactor to " << (*runner).second.second << "." << endl;
     2489        *out << Verbose(2) << "Setting " << ++NumberOfFragments << " fragment's TEFactor to " << (*runner).second.second << "." << endl; 
    25572490      } else {
    25582491        status = false;
     
    25952528  if(output != NULL) {
    25962529    for(Graph::iterator runner = KeySetList.begin(); runner != KeySetList.end(); runner++) {
    2597       for (KeySet::iterator sprinter = (*runner).first.begin();sprinter != (*runner).first.end(); sprinter++) {
     2530      for (KeySet::iterator sprinter = (*runner).first.begin();sprinter != (*runner).first.end(); sprinter++) { 
    25982531        if (sprinter != (*runner).first.begin())
    25992532          output << "\t";
     
    26612594    status = false;
    26622595  }
    2663 
     2596 
    26642597  return status;
    26652598};
     
    26702603 * \param **ListOfAtoms allocated (molecule::AtomCount) and filled lookup table for ids (Atom::nr) to *Atom
    26712604 * \return true - structure is equal, false - not equivalence
    2672  */
     2605 */ 
    26732606bool molecule::CheckAdjacencyFileAgainstMolecule(ofstream *out, char *path, atom **ListOfAtoms)
    26742607{
     
    26772610  bool status = true;
    26782611  char *buffer = (char *) Malloc(sizeof(char)*MAXSTRINGSIZE, "molecule::CheckAdjacencyFileAgainstMolecule: *buffer");
    2679 
     2612 
    26802613  filename << path << "/" << FRAGMENTPREFIX << ADJACENCYFILE;
    26812614  File.open(filename.str().c_str(), ios::out);
     
    27362669  *out << endl;
    27372670  Free((void **)&buffer, "molecule::CheckAdjacencyFileAgainstMolecule: *buffer");
    2738 
     2671 
    27392672  return status;
    27402673};
     
    27582691  for(int i=AtomCount;i--;)
    27592692    AtomMask[i] = false;
    2760 
     2693 
    27612694  if (Order < 0) { // adaptive increase of BondOrder per site
    27622695    if (AtomMask[AtomCount] == true)  // break after one step
     
    27982731          line >> ws >> Value; // skip time entry
    27992732          line >> ws >> Value;
    2800           No -= 1;  // indices start at 1 in file, not 0
     2733          No -= 1;  // indices start at 1 in file, not 0 
    28012734          //*out << Verbose(2) << " - yields (" << No << "," << Value << ", " << FragOrder << ")" << endl;
    28022735
     
    28072740            // as the smallest number in each set has always been the root (we use global id to keep the doubles away), seek smallest and insert into AtomMask
    28082741            pair <map<int, pair<double,int> >::iterator, bool> InsertedElement = AdaptiveCriteriaList.insert( make_pair(*((*marker).second.begin()), pair<double,int>( fabs(Value), FragOrder) ));
    2809             map<int, pair<double,int> >::iterator PresentItem = InsertedElement.first;
     2742            map<int, pair<double,int> >::iterator PresentItem = InsertedElement.first; 
    28102743            if (!InsertedElement.second) { // this root is already present
    2811               if ((*PresentItem).second.second < FragOrder)  // if order there is lower, update entry with higher-order term
    2812                 //if ((*PresentItem).second.first < (*runner).first)    // as higher-order terms are not always better, we skip this part (which would always include this site into adaptive increase)
     2744              if ((*PresentItem).second.second < FragOrder)  // if order there is lower, update entry with higher-order term 
     2745                //if ((*PresentItem).second.first < (*runner).first)    // as higher-order terms are not always better, we skip this part (which would always include this site into adaptive increase) 
    28132746                {  // if value is smaller, update value and order
    28142747                (*PresentItem).second.first = fabs(Value);
     
    28482781        Walker = FindAtom(No);
    28492782        //if (Walker->AdaptiveOrder < MinimumRingSize[Walker->nr]) {
    2850           *out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true." << endl;
     2783          *out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", setting entry " << No << " of Atom mask to true." << endl; 
    28512784          AtomMask[No] = true;
    28522785          status = true;
    28532786        //} else
    2854           //*out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->nr] << " does not allow further adaptive increase." << endl;
     2787          //*out << Verbose(2) << "Root " << No << " is still above threshold (10^{" << Order <<"}: " << runner->first << ", however MinimumRingSize of " << MinimumRingSize[Walker->nr] << " does not allow further adaptive increase." << endl; 
    28552788      }
    28562789      // close and done
     
    28862819    if ((Order == 0) && (AtomMask[AtomCount] == false))  // single stepping, just check
    28872820      status = true;
    2888 
     2821     
    28892822    if (!status) {
    28902823      if (Order == 0)
     
    28942827    }
    28952828  }
    2896 
     2829 
    28972830  // print atom mask for debugging
    28982831  *out << "              ";
     
    29032836    *out << (AtomMask[i] ? "t" : "f");
    29042837  *out << endl;
    2905 
     2838 
    29062839  return status;
    29072840};
     
    29172850  int AtomNo = 0;
    29182851  atom *Walker = NULL;
    2919 
     2852 
    29202853  if (SortIndex != NULL) {
    29212854    *out << Verbose(1) << "SortIndex is " << SortIndex << " and not NULL as expected." << endl;
     
    29752908  atom **ListOfAtoms = NULL;
    29762909  atom ***ListOfLocalAtoms = NULL;
    2977   bool *AtomMask = NULL;
    2978 
     2910  bool *AtomMask = NULL; 
     2911 
    29792912  *out << endl;
    29802913#ifdef ADDHYDROGEN
     
    29852918
    29862919  // ++++++++++++++++++++++++++++ INITIAL STUFF: Bond structure analysis, file parsing, ... ++++++++++++++++++++++++++++++++++++++++++
    2987 
     2920 
    29882921  // ===== 1. Check whether bond structure is same as stored in files ====
    2989 
     2922 
    29902923  // fill the adjacency list
    29912924  CreateListOfBondsPerAtom(out);
     
    29932926  // create lookup table for Atom::nr
    29942927  FragmentationToDo = FragmentationToDo && CreateFatherLookupTable(out, start, end, ListOfAtoms, AtomCount);
    2995 
     2928 
    29962929  // === compare it with adjacency file ===
    2997   FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule(out, configuration->configpath, ListOfAtoms);
     2930  FragmentationToDo = FragmentationToDo && CheckAdjacencyFileAgainstMolecule(out, configuration->configpath, ListOfAtoms); 
    29982931  Free((void **)&ListOfAtoms, "molecule::FragmentMolecule - **ListOfAtoms");
    29992932
     
    30242957    delete(LocalBackEdgeStack);
    30252958  }
    3026 
     2959 
    30272960  // ===== 3. if structure still valid, parse key set file and others =====
    30282961  FragmentationToDo = FragmentationToDo && ParseKeySetFile(out, configuration->configpath, ParsedFragmentList);
     
    30302963  // ===== 4. check globally whether there's something to do actually (first adaptivity check)
    30312964  FragmentationToDo = FragmentationToDo && ParseOrderAtSiteFromFile(out, configuration->configpath);
    3032 
    3033   // =================================== Begin of FRAGMENTATION ===============================
    3034   // ===== 6a. assign each keyset to its respective subgraph =====
     2965 
     2966  // =================================== Begin of FRAGMENTATION =============================== 
     2967  // ===== 6a. assign each keyset to its respective subgraph ===== 
    30352968  Subgraphs->next->AssignKeySetsToFragment(out, this, ParsedFragmentList, ListOfLocalAtoms, FragmentList, (FragmentCounter = 0), true);
    30362969
     
    30432976    FragmentationToDo = FragmentationToDo || CheckOrder;
    30442977    AtomMask[AtomCount] = true;   // last plus one entry is used as marker that we have been through this loop once already in CheckOrderAtSite()
    3045     // ===== 6b. fill RootStack for each subgraph (second adaptivity check) =====
     2978    // ===== 6b. fill RootStack for each subgraph (second adaptivity check) ===== 
    30462979    Subgraphs->next->FillRootStackForSubgraphs(out, RootStack, AtomMask, (FragmentCounter = 0));
    30472980
     
    30673000  delete(ParsedFragmentList);
    30683001  delete[](MinimumRingSize);
    3069 
     3002 
    30703003
    30713004  // ==================================== End of FRAGMENTATION ============================================
     
    30733006  // ===== 8a. translate list into global numbers (i.e. ones that are valid in "this" molecule, not in MolecularWalker->Leaf)
    30743007  Subgraphs->next->TranslateIndicesToGlobalIDs(out, FragmentList, (FragmentCounter = 0), TotalNumberOfKeySets, TotalGraph);
    3075 
     3008 
    30763009  // free subgraph memory again
    30773010  FragmentCounter = 0;
     
    30983031    }
    30993032    *out << k << "/" << BondFragments->NumberOfMolecules << " fragments generated from the keysets." << endl;
    3100 
     3033   
    31013034    // ===== 9. Save fragments' configuration and keyset files et al to disk ===
    31023035    if (BondFragments->NumberOfMolecules != 0) {
    31033036      // create the SortIndex from BFS labels to order in the config file
    31043037      CreateMappingLabelsToConfigSequence(out, SortIndex);
    3105 
     3038     
    31063039      *out << Verbose(1) << "Writing " << BondFragments->NumberOfMolecules << " possible bond fragmentation configs" << endl;
    31073040      if (BondFragments->OutputConfigForListOfFragments(out, configuration, SortIndex))
     
    31093042      else
    31103043        *out << Verbose(1) << "Some config writing failed." << endl;
    3111 
     3044 
    31123045      // store force index reference file
    31133046      BondFragments->StoreForcesFile(out, configuration->configpath, SortIndex);
    3114 
    3115       // store keysets file
     3047     
     3048      // store keysets file 
    31163049      StoreKeySetFile(out, TotalGraph, configuration->configpath);
    3117 
    3118       // store Adjacency file
     3050 
     3051      // store Adjacency file 
    31193052      StoreAdjacencyToFile(out, configuration->configpath);
    3120 
     3053 
    31213054      // store Hydrogen saturation correction file
    31223055      BondFragments->AddHydrogenCorrection(out, configuration->configpath);
    3123 
     3056     
    31243057      // store adaptive orders into file
    31253058      StoreOrderAtSiteFile(out, configuration->configpath);
    3126 
     3059     
    31273060      // restore orbital and Stop values
    31283061      CalculateOrbitals(*configuration);
    3129 
     3062     
    31303063      // free memory for bond part
    31313064      *out << Verbose(1) << "Freeing bond memory" << endl;
    31323065      delete(FragmentList); // remove bond molecule from memory
    3133       Free((void **)&SortIndex, "molecule::FragmentMolecule: *SortIndex");
     3066      Free((void **)&SortIndex, "molecule::FragmentMolecule: *SortIndex"); 
    31343067    } else
    31353068      *out << Verbose(1) << "FragmentList is zero on return, splitting failed." << endl;
    3136   //} else
     3069  //} else 
    31373070  //  *out << Verbose(1) << "No fragments to store." << endl;
    31383071  *out << Verbose(0) << "End of bond fragmentation." << endl;
     
    31603093  atom *Walker = NULL, *OtherAtom = NULL;
    31613094  ReferenceStack->Push(Binder);
    3162 
     3095 
    31633096  do {  // go through all bonds and push local ones
    31643097    Walker = ListOfLocalAtoms[Binder->leftatom->nr];  // get one atom in the reference molecule
    3165     if (Walker != NULL) // if this Walker exists in the subgraph ...
     3098    if (Walker != NULL) // if this Walker exists in the subgraph ... 
    31663099        for(int i=0;i<NumberOfBondsPerAtom[Walker->nr];i++) {    // go through the local list of bonds
    31673100        OtherAtom = ListOfBondsPerAtom[Walker->nr][i]->GetOtherAtom(Walker);
     
    31763109    ReferenceStack->Push(Binder);
    31773110  } while (FirstBond != Binder);
    3178 
     3111 
    31793112  return status;
    31803113};
     
    32523185      Walker->AdaptiveOrder = OrderArray[Walker->nr];
    32533186      Walker->MaxOrder = MaxArray[Walker->nr];
    3254       *out << Verbose(2) << *Walker << " gets order " << (int)Walker->AdaptiveOrder << " and is " << (!Walker->MaxOrder ? "not " : " ") << "maxed." << endl;
     3187      *out << Verbose(2) << *Walker << " gets order " << (int)Walker->AdaptiveOrder << " and is " << (!Walker->MaxOrder ? "not " : " ") << "maxed." << endl; 
    32553188    }
    32563189    file.close();
     
    32633196  Free((void **)&OrderArray, "molecule::ParseOrderAtSiteFromFile - *OrderArray");
    32643197  Free((void **)&MaxArray, "molecule::ParseOrderAtSiteFromFile - *MaxArray");
    3265 
     3198 
    32663199  *out << Verbose(1) << "End of ParseOrderAtSiteFromFile" << endl;
    32673200  return status;
     
    33213254  Walker = start;
    33223255  while (Walker->next != end) {
    3323     Walker = Walker->next;
     3256    Walker = Walker->next; 
    33243257    *out << Verbose(4) << "Atom " << Walker->Name << "/" << Walker->nr << " with " << NumberOfBondsPerAtom[Walker->nr] << " bonds: ";
    33253258    TotalDegree = 0;
     
    33293262    }
    33303263    *out << " -- TotalDegree: " << TotalDegree << endl;
    3331   }
     3264  }     
    33323265  *out << Verbose(1) << "End of Creating ListOfBondsPerAtom." << endl << endl;
    33333266};
     
    33353268/** Adds atoms up to \a BondCount distance from \a *Root and notes them down in \a **AddedAtomList.
    33363269 * Gray vertices are always enqueued in an StackClass<atom *> FIFO queue, the rest is usual BFS with adding vertices found was
    3337  * white and putting into queue.
     3270 * white and putting into queue. 
    33383271 * \param *out output stream for debugging
    33393272 * \param *Mol Molecule class to add atoms to
     
    33443277 * \param BondOrder maximum distance for vertices to add
    33453278 * \param IsAngstroem lengths are in angstroem or bohrradii
    3346  */
     3279 */ 
    33473280void molecule::BreadthFirstSearchAdd(ofstream *out, molecule *Mol, atom **&AddedAtomList, bond **&AddedBondList, atom *Root, bond *Bond, int BondOrder, bool IsAngstroem)
    33483281{
     
    33703303  }
    33713304  ShortestPathList[Root->nr] = 0;
    3372 
     3305 
    33733306  // and go on ... Queue always contains all lightgray vertices
    33743307  while (!AtomStack->IsEmpty()) {
     
    33783311    // followed by n+1 till top of stack.
    33793312    Walker = AtomStack->PopFirst(); // pop oldest added
    3380     *out << Verbose(1) << "Current Walker is: " << Walker->Name << ", and has " << NumberOfBondsPerAtom[Walker->nr] << " bonds." << endl;
     3313    *out << Verbose(1) << "Current Walker is: " << Walker->Name << ", and has " << NumberOfBondsPerAtom[Walker->nr] << " bonds." << endl; 
    33813314    for(int i=0;i<NumberOfBondsPerAtom[Walker->nr];i++) {
    33823315      Binder = ListOfBondsPerAtom[Walker->nr][i];
     
    33853318        *out << Verbose(2) << "Current OtherAtom is: " << OtherAtom->Name << " for bond " << *Binder << "." << endl;
    33863319        if (ColorList[OtherAtom->nr] == white) {
    3387           if (Binder != Bond) // let other atom white if it's via Root bond. In case it's cyclic it has to be reached again (yet Root is from OtherAtom already black, thus no problem)
     3320          if (Binder != Bond) // let other atom white if it's via Root bond. In case it's cyclic it has to be reached again (yet Root is from OtherAtom already black, thus no problem) 
    33883321            ColorList[OtherAtom->nr] = lightgray;
    33893322          PredecessorList[OtherAtom->nr] = Walker;  // Walker is the predecessor
    33903323          ShortestPathList[OtherAtom->nr] = ShortestPathList[Walker->nr]+1;
    3391           *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " " << ((ColorList[OtherAtom->nr] == white) ? "white" : "lightgray") << ", its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl;
     3324          *out << Verbose(2) << "Coloring OtherAtom " << OtherAtom->Name << " " << ((ColorList[OtherAtom->nr] == white) ? "white" : "lightgray") << ", its predecessor is " << Walker->Name << " and its Shortest Path is " << ShortestPathList[OtherAtom->nr] << " egde(s) long." << endl; 
    33923325          if ((((ShortestPathList[OtherAtom->nr] < BondOrder) && (Binder != Bond))) ) { // Check for maximum distance
    33933326            *out << Verbose(3);
     
    34373370          // This has to be a cyclic bond, check whether it's present ...
    34383371          if (AddedBondList[Binder->nr] == NULL) {
    3439             if ((Binder != Bond) && (Binder->Cyclic) && (((ShortestPathList[Walker->nr]+1) < BondOrder))) {
     3372            if ((Binder != Bond) && (Binder->Cyclic) && (((ShortestPathList[Walker->nr]+1) < BondOrder))) { 
    34403373              AddedBondList[Binder->nr] = Mol->AddBond(AddedAtomList[Walker->nr], AddedAtomList[OtherAtom->nr], Binder->BondDegree);
    34413374              AddedBondList[Binder->nr]->Cyclic = Binder->Cyclic;
     
    34523385    }
    34533386    ColorList[Walker->nr] = black;
    3454     *out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl;
     3387    *out << Verbose(1) << "Coloring Walker " << Walker->Name << " black." << endl; 
    34553388  }
    34563389  Free((void **)&PredecessorList, "molecule::BreadthFirstSearchAdd: **PredecessorList");
     
    34763409
    34773410  *out << Verbose(2) << "Begin of BuildInducedSubgraph." << endl;
    3478 
     3411 
    34793412  // reset parent list
    34803413  *out << Verbose(3) << "Resetting ParentList." << endl;
    34813414  for (int i=Father->AtomCount;i--;)
    34823415    ParentList[i] = NULL;
    3483 
     3416 
    34843417  // fill parent list with sons
    34853418  *out << Verbose(3) << "Filling Parent List." << endl;
     
    35223455 * \param *&Leaf KeySet to look through
    35233456 * \param *&ShortestPathList list of the shortest path to decide which atom to suggest as removal candidate in the end
    3524  * \param index of the atom suggested for removal
     3457 * \param index of the atom suggested for removal 
    35253458 */
    35263459int molecule::LookForRemovalCandidate(ofstream *&out, KeySet *&Leaf, int *&ShortestPathList)
     
    35283461  atom *Runner = NULL;
    35293462  int SP, Removal;
    3530 
     3463 
    35313464  *out << Verbose(2) << "Looking for removal candidate." << endl;
    35323465  SP = -1; //0;  // not -1, so that Root is never removed
     
    35463479/** Stores a fragment from \a KeySet into \a molecule.
    35473480 * First creates the minimal set of atoms from the KeySet, then creates the bond structure from the complete
    3548  * molecule and adds missing hydrogen where bonds were cut.
     3481 * molecule and adds missing hydrogen where bonds were cut. 
    35493482 * \param *out output stream for debugging messages
    3550  * \param &Leaflet pointer to KeySet structure
     3483 * \param &Leaflet pointer to KeySet structure 
    35513484 * \param IsAngstroem whether we have Ansgtroem or bohrradius
    35523485 * \return pointer to constructed molecule
     
    35593492  bool LonelyFlag = false;
    35603493  int size;
    3561 
     3494 
    35623495//  *out << Verbose(1) << "Begin of StoreFragmentFromKeyset." << endl;
    3563 
     3496 
    35643497  Leaf->BondDistance = BondDistance;
    35653498  for(int i=NDIM*2;i--;)
    3566     Leaf->cell_size[i] = cell_size[i];
     3499    Leaf->cell_size[i] = cell_size[i]; 
    35673500
    35683501  // initialise SonList (indicates when we need to replace a bond with hydrogen instead)
     
    35773510    size++;
    35783511  }
    3579 
     3512 
    35803513  // create the bonds between all: Make it an induced subgraph and add hydrogen
    35813514//  *out << Verbose(2) << "Creating bonds from father graph (i.e. induced subgraph creation)." << endl;
     
    35873520    if (SonList[FatherOfRunner->nr] != NULL)  {  // check if this, our father, is present in list
    35883521      // create all bonds
    3589       for (int i=0;i<NumberOfBondsPerAtom[FatherOfRunner->nr];i++) { // go through every bond of father
     3522      for (int i=0;i<NumberOfBondsPerAtom[FatherOfRunner->nr];i++) { // go through every bond of father 
    35903523        OtherFather = ListOfBondsPerAtom[FatherOfRunner->nr][i]->GetOtherAtom(FatherOfRunner);
    35913524//        *out << Verbose(2) << "Father " << *FatherOfRunner << " of son " << *SonList[FatherOfRunner->nr] << " is bound to " << *OtherFather;
    35923525        if (SonList[OtherFather->nr] != NULL) {
    3593 //          *out << ", whose son is " << *SonList[OtherFather->nr] << "." << endl;
     3526//          *out << ", whose son is " << *SonList[OtherFather->nr] << "." << endl; 
    35943527          if (OtherFather->nr > FatherOfRunner->nr) { // add bond (nr check is for adding only one of both variants: ab, ba)
    35953528//            *out << Verbose(3) << "Adding Bond: ";
    3596 //            *out <<
     3529//            *out << 
    35973530            Leaf->AddBond(Runner, SonList[OtherFather->nr], ListOfBondsPerAtom[FatherOfRunner->nr][i]->BondDegree);
    35983531//            *out << "." << endl;
    35993532            //NumBonds[Runner->nr]++;
    3600           } else {
     3533          } else { 
    36013534//            *out << Verbose(3) << "Not adding bond, labels in wrong order." << endl;
    36023535          }
    36033536          LonelyFlag = false;
    36043537        } else {
    3605 //          *out << ", who has no son in this fragment molecule." << endl;
     3538//          *out << ", who has no son in this fragment molecule." << endl; 
    36063539#ifdef ADDHYDROGEN
    36073540          //*out << Verbose(3) << "Adding Hydrogen to " << Runner->Name << " and a bond in between." << endl;
     
    36213554    while ((Runner->next != Leaf->end) && (Runner->next->type->Z == 1)) // skip added hydrogen
    36223555      Runner = Runner->next;
    3623 #endif
     3556#endif       
    36243557  }
    36253558  Leaf->CreateListOfBondsPerAtom(out);
     
    36543587  StackClass<atom *> *TouchedStack = new StackClass<atom *>((int)pow(4,Order)+2); // number of atoms reached from one with maximal 4 bonds plus Root itself
    36553588  StackClass<atom *> *SnakeStack = new StackClass<atom *>(Order+1); // equal to Order is not possible, as then the StackClass<atom *> cannot discern between full and empty stack!
    3656   MoleculeLeafClass *Leaflet = NULL, *TempLeaf = NULL;
     3589  MoleculeLeafClass *Leaflet = NULL, *TempLeaf = NULL; 
    36573590  MoleculeListClass *FragmentList = NULL;
    36583591  atom *Walker = NULL, *OtherAtom = NULL, *Root = NULL, *Removal = NULL;
     
    37043637                // clear snake stack
    37053638          SnakeStack->ClearStack();
    3706     //SnakeStack->TestImplementation(out, start->next);
     3639    //SnakeStack->TestImplementation(out, start->next);   
    37073640
    37083641    ///// INNER LOOP ////////////
     
    37253658        }
    37263659        if (ShortestPathList[Walker->nr] == -1) {
    3727           ShortestPathList[Walker->nr] = ShortestPathList[PredecessorList[Walker->nr]->nr]+1;
     3660          ShortestPathList[Walker->nr] = ShortestPathList[PredecessorList[Walker->nr]->nr]+1; 
    37283661          TouchedStack->Push(Walker); // mark every atom for lists cleanup later, whose shortest path has been changed
    37293662        }
     
    37633696                                OtherAtom = Binder->GetOtherAtom(Walker);
    37643697            if ((Labels[OtherAtom->nr] != -1) && (Labels[OtherAtom->nr] < Labels[Root->nr])) { // we don't step up to labels bigger than us
    3765               *out << "Label " << Labels[OtherAtom->nr] << " is smaller than Root's " << Labels[Root->nr] << "." << endl;
     3698              *out << "Label " << Labels[OtherAtom->nr] << " is smaller than Root's " << Labels[Root->nr] << "." << endl; 
    37663699              //ColorVertexList[OtherAtom->nr] = lightgray;    // mark as explored
    37673700            } else { // otherwise check its colour and element
    37683701                                if (
    37693702#ifdef ADDHYDROGEN
    3770               (OtherAtom->type->Z != 1) &&
     3703              (OtherAtom->type->Z != 1) && 
    37713704#endif
    37723705                    (ColorEdgeList[Binder->nr] == white)) {  // skip hydrogen, look for unexplored vertices
     
    37783711                //} else {
    37793712                //  *out << Verbose(3) << "Predecessor of " << OtherAtom->Name << " is " << PredecessorList[OtherAtom->nr]->Name << "." << endl;
    3780                 //}
     3713                //} 
    37813714                Walker = OtherAtom;
    37823715                break;
    37833716              } else {
    3784                 if (OtherAtom->type->Z == 1)
     3717                if (OtherAtom->type->Z == 1) 
    37853718                  *out << "Links to a hydrogen atom." << endl;
    3786                 else
     3719                else                 
    37873720                  *out << "Bond has not white but " << GetColor(ColorEdgeList[Binder->nr]) << " color." << endl;
    37883721              }
     
    37943727          *out << Verbose(3) << "We have gone too far, stepping back to " << Walker->Name << "." << endl;
    37953728        }
    3796                         if (Walker != OtherAtom) {      // if no white neighbours anymore, color it black
     3729                        if (Walker != OtherAtom) {      // if no white neighbours anymore, color it black 
    37973730          *out << Verbose(2) << "Coloring " << Walker->Name << " black." << endl;
    37983731                                ColorVertexList[Walker->nr] = black;
     
    38013734      }
    38023735        } while ((Walker != Root) || (ColorVertexList[Root->nr] != black));
    3803     *out << Verbose(2) << "Inner Looping is finished." << endl;
     3736    *out << Verbose(2) << "Inner Looping is finished." << endl;   
    38043737
    38053738    // if we reset all AtomCount atoms, we have again technically O(N^2) ...
     
    38173750    }
    38183751  }
    3819   *out << Verbose(1) << "Outer Looping over all vertices is done." << endl;
     3752  *out << Verbose(1) << "Outer Looping over all vertices is done." << endl; 
    38203753
    38213754  // copy together
    3822   *out << Verbose(1) << "Copying all fragments into MoleculeList structure." << endl;
     3755  *out << Verbose(1) << "Copying all fragments into MoleculeList structure." << endl; 
    38233756  FragmentList = new MoleculeListClass(FragmentCounter, AtomCount);
    38243757  RunningIndex = 0;
     
    38913824
    38923825  NumCombinations = 1 << SetDimension;
    3893 
     3826 
    38943827  // Hier muessen von 1 bis NumberOfBondsPerAtom[Walker->nr] alle Kombinationen
    38953828  // von Endstuecken (aus den Bonds) hinzugefᅵᅵgt werden und fᅵᅵr verbleibende ANOVAOrder
    38963829  // rekursiv GraphCrawler in der nᅵᅵchsten Ebene aufgerufen werden
    3897 
     3830 
    38983831  *out << Verbose(1+verbosity) << "Begin of SPFragmentGenerator." << endl;
    38993832  *out << Verbose(1+verbosity) << "We are " << RootDistance << " away from Root, which is " << *FragmentSearch->Root << ", SubOrder is " << SubOrder << ", SetDimension is " << SetDimension << " and this means " <<  NumCombinations-1 << " combination(s)." << endl;
    39003833
    3901   // initialised touched list (stores added atoms on this level)
     3834  // initialised touched list (stores added atoms on this level) 
    39023835  *out << Verbose(1+verbosity) << "Clearing touched list." << endl;
    39033836  for (TouchedIndex=SubOrder+1;TouchedIndex--;)  // empty touched list
    39043837    TouchedList[TouchedIndex] = -1;
    39053838  TouchedIndex = 0;
    3906 
     3839 
    39073840  // create every possible combination of the endpieces
    39083841  *out << Verbose(1+verbosity) << "Going through all combinations of the power set." << endl;
     
    39123845    for (int j=SetDimension;j--;)
    39133846      bits += (i & (1 << j)) >> j;
    3914 
     3847     
    39153848    *out << Verbose(1+verbosity) << "Current set is " << Binary(i | (1 << SetDimension)) << ", number of bits is " << bits << "." << endl;
    39163849    if (bits <= SubOrder) { // if not greater than additional atoms allowed on stack, continue
     
    39203853        bit = ((i & (1 << j)) != 0);  // mask the bit for the j-th bond
    39213854        if (bit) {  // if bit is set, we add this bond partner
    3922                 OtherWalker = BondsSet[j]->rightatom;   // rightatom is always the one more distant, i.e. the one to add
     3855                OtherWalker = BondsSet[j]->rightatom;   // rightatom is always the one more distant, i.e. the one to add 
    39233856          //*out << Verbose(1+verbosity) << "Current Bond is " << ListOfBondsPerAtom[Walker->nr][i] << ", checking on " << *OtherWalker << "." << endl;
    39243857          *out << Verbose(2+verbosity) << "Adding " << *OtherWalker << " with nr " << OtherWalker->nr << "." << endl;
    3925           TestKeySetInsert = FragmentSearch->FragmentSet->insert(OtherWalker->nr);
     3858          TestKeySetInsert = FragmentSearch->FragmentSet->insert(OtherWalker->nr); 
    39263859          if (TestKeySetInsert.second) {
    39273860            TouchedList[TouchedIndex++] = OtherWalker->nr;  // note as added
     
    39363869        }
    39373870      }
    3938 
    3939       SpaceLeft = SubOrder - Added ;// SubOrder - bits; // due to item's maybe being already present, this does not work anymore
     3871     
     3872      SpaceLeft = SubOrder - Added ;// SubOrder - bits; // due to item's maybe being already present, this does not work anymore 
    39403873      if (SpaceLeft > 0) {
    39413874        *out << Verbose(1+verbosity) << "There's still some space left on stack: " << SpaceLeft << "." << endl;
     
    39653898          }
    39663899          *out << Verbose(2+verbosity) << "Calling subset generator " << SP << " away from root " << *FragmentSearch->Root << " with sub set dimension " << SubSetDimension << "." << endl;
    3967           SPFragmentGenerator(out, FragmentSearch, SP, BondsList, SubSetDimension, SubOrder-bits);
     3900          SPFragmentGenerator(out, FragmentSearch, SP, BondsList, SubSetDimension, SubOrder-bits); 
    39683901          Free((void **)&BondsList, "molecule::SPFragmentGenerator: **BondsList");
    39693902        }
     
    39743907        *out << Verbose(2) << "Found a new fragment[" << FragmentSearch->FragmentCounter << "], local nr.s are: ";
    39753908        for(KeySet::iterator runner = FragmentSearch->FragmentSet->begin(); runner != FragmentSearch->FragmentSet->end(); runner++)
    3976           *out << (*runner) << " ";
     3909          *out << (*runner) << " "; 
    39773910        *out << endl;
    39783911        //if (!CheckForConnectedSubgraph(out, FragmentSearch->FragmentSet))
     
    39823915        //Removal = StoreFragmentFromStack(out, FragmentSearch->Root, FragmentSearch->Leaflet, FragmentSearch->FragmentStack, FragmentSearch->ShortestPathList, &FragmentSearch->FragmentCounter, FragmentSearch->configuration);
    39833916      }
    3984 
     3917     
    39853918      // --3-- remove all added items in this level from snake stack
    39863919      *out << Verbose(1+verbosity) << "Removing all items that were added on this SP level " << RootDistance << "." << endl;
     
    39933926      *out << Verbose(2) << "Remaining local nr.s on snake stack are: ";
    39943927      for(KeySet::iterator runner = FragmentSearch->FragmentSet->begin(); runner != FragmentSearch->FragmentSet->end(); runner++)
    3995         *out << (*runner) << " ";
     3928        *out << (*runner) << " "; 
    39963929      *out << endl;
    39973930      TouchedIndex = 0; // set Index to 0 for list of atoms added on this level
     
    40003933    }
    40013934  }
    4002   Free((void **)&TouchedList, "molecule::SPFragmentGenerator: *TouchedList");
     3935  Free((void **)&TouchedList, "molecule::SPFragmentGenerator: *TouchedList"); 
    40033936  *out << Verbose(1+verbosity) << "End of SPFragmentGenerator, " << RootDistance << " away from Root " << *FragmentSearch->Root << " and SubOrder is " << SubOrder << "." << endl;
    40043937};
     
    40093942 * \return true - connected, false - disconnected
    40103943 * \note this is O(n^2) for it's just a bug checker not meant for permanent use!
    4011  */
     3944 */ 
    40123945bool molecule::CheckForConnectedSubgraph(ofstream *out, KeySet *Fragment)
    40133946{
     
    40153948  bool BondStatus = false;
    40163949  int size;
    4017 
     3950 
    40183951  *out << Verbose(1) << "Begin of CheckForConnectedSubgraph" << endl;
    40193952  *out << Verbose(2) << "Disconnected atom: ";
    4020 
     3953 
    40213954  // count number of atoms in graph
    40223955  size = 0;
     
    40643997 * \param *out output stream for debugging
    40653998 * \param Order bond order (limits BFS exploration and "number of digits" in power set generation
    4066  * \param FragmentSearch UniqueFragments structure containing TEFactor, root atom and so on
     3999 * \param FragmentSearch UniqueFragments structure containing TEFactor, root atom and so on 
    40674000 * \param RestrictedKeySet Restricted vertex set to use in context of molecule
    40684001 * \return number of inserted fragments
    40694002 * \note ShortestPathList in FragmentSearch structure is probably due to NumberOfAtomsSPLevel and SP not needed anymore
    40704003 */
    4071 int molecule::PowerSetGenerator(ofstream *out, int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet)
     4004int molecule::PowerSetGenerator(ofstream *out, int Order, struct UniqueFragments &FragmentSearch, KeySet RestrictedKeySet) 
    40724005{
    40734006  int SP, AtomKeyNr;
     
    40904023    FragmentSearch.BondsPerSPCount[i] = 0;
    40914024  FragmentSearch.BondsPerSPCount[0] = 1;
    4092   Binder = new bond(FragmentSearch.Root, FragmentSearch.Root);
     4025  Binder = new bond(FragmentSearch.Root, FragmentSearch.Root); 
    40934026  add(Binder, FragmentSearch.BondsPerSPList[1]);
    4094 
     4027 
    40954028  // do a BFS search to fill the SP lists and label the found vertices
    40964029  // Actually, we should construct a spanning tree vom the root atom and select all edges therefrom and put them into
    40974030  // according shortest path lists. However, we don't. Rather we fill these lists right away, as they do form a spanning
    40984031  // tree already sorted into various SP levels. That's why we just do loops over the depth (CurrentSP) and breadth
    4099   // (EdgeinSPLevel) of this tree ...
     4032  // (EdgeinSPLevel) of this tree ... 
    41004033  // In another picture, the bonds always contain a direction by rightatom being the one more distant from root and hence
    41014034  // naturally leftatom forming its predecessor, preventing the BFS"seeker" from continuing in the wrong direction.
     
    41504083    }
    41514084  }
    4152 
     4085 
    41534086  // outputting all list for debugging
    41544087  *out << Verbose(0) << "Printing all found lists." << endl;
     
    41594092      Binder = Binder->next;
    41604093      *out << Verbose(2) << *Binder << endl;
    4161     }
    4162   }
    4163 
     4094    } 
     4095  }
     4096 
    41644097  // creating fragments with the found edge sets  (may be done in reverse order, faster)
    41654098  SP = -1;  // the Root <-> Root edge must be subtracted!
     
    41684101    while (Binder->next != FragmentSearch.BondsPerSPList[2*i+1]) {
    41694102      Binder = Binder->next;
    4170       SP ++;
     4103      SP ++; 
    41714104    }
    41724105  }
     
    41754108    // start with root (push on fragment stack)
    41764109    *out << Verbose(0) << "Starting fragment generation with " << *FragmentSearch.Root << ", local nr is " << FragmentSearch.Root->nr << "." << endl;
    4177     FragmentSearch.FragmentSet->clear();
     4110    FragmentSearch.FragmentSet->clear(); 
    41784111    *out << Verbose(0) << "Preparing subset for this root and calling generator." << endl;
    41794112    // prepare the subset and call the generator
    41804113    BondsList = (bond **) Malloc(sizeof(bond *)*FragmentSearch.BondsPerSPCount[0], "molecule::PowerSetGenerator: **BondsList");
    41814114    BondsList[0] = FragmentSearch.BondsPerSPList[0]->next;  // on SP level 0 there's only the root bond
    4182 
     4115   
    41834116    SPFragmentGenerator(out, &FragmentSearch, 0, BondsList, FragmentSearch.BondsPerSPCount[0], Order);
    4184 
     4117   
    41854118    Free((void **)&BondsList, "molecule::PowerSetGenerator: **BondsList");
    41864119  } else {
     
    41914124  // remove root from stack
    41924125  *out << Verbose(0) << "Removing root again from stack." << endl;
    4193   FragmentSearch.FragmentSet->erase(FragmentSearch.Root->nr);
     4126  FragmentSearch.FragmentSet->erase(FragmentSearch.Root->nr);   
    41944127
    41954128  // free'ing the bonds lists
     
    42104143  }
    42114144
    4212   // return list
     4145  // return list 
    42134146  *out << Verbose(0) << "End of PowerSetGenerator." << endl;
    42144147  return (FragmentSearch.FragmentCounter - Counter);
     
    42414174    // remove bonds that are beyond bonddistance
    42424175    for(int i=NDIM;i--;)
    4243       Translationvector.x[i] = 0.;
     4176      Translationvector.x[i] = 0.; 
    42444177    // scan all bonds
    42454178    Binder = first;
     
    42884221        }
    42894222      }
    4290       // re-add bond
     4223      // re-add bond   
    42914224      link(Binder, OtherBinder);
    42924225    } else {
     
    43424275        IteratorB++;
    43434276      } // end of while loop
    4344     }// end of check in case of equal sizes
     4277    }// end of check in case of equal sizes 
    43454278  }
    43464279  return false; // if we reach this point, they are equal
     
    43864319 * \param graph1 first (dest) graph
    43874320 * \param graph2 second (source) graph
    4388  * \param *counter keyset counter that gets increased
     4321 * \param *counter keyset counter that gets increased 
    43894322 */
    43904323inline void InsertGraphIntoGraph(ofstream *out, Graph &graph1, Graph &graph2, int *counter)
     
    44314364  int RootKeyNr, RootNr;
    44324365  struct UniqueFragments FragmentSearch;
    4433 
     4366 
    44344367  *out << Verbose(0) << "Begin of FragmentBOSSANOVA." << endl;
    44354368
     
    44544387    Walker = Walker->next;
    44554388    CompleteMolecule.insert(Walker->GetTrueFather()->nr);
    4456   }
     4389  } 
    44574390
    44584391  // this can easily be seen: if Order is 5, then the number of levels for each lower order is the total sum of the number of levels above, as
     
    44684401    //if ((MinimumRingSize[Walker->GetTrueFather()->nr] != -1) && (Walker->GetTrueFather()->AdaptiveOrder+1 > MinimumRingSize[Walker->GetTrueFather()->nr])) {
    44694402    //  *out << Verbose(0) << "Bond order " << Walker->GetTrueFather()->AdaptiveOrder << " of Root " << *Walker << " greater than or equal to Minimum Ring size of " << MinimumRingSize << " found is not allowed." << endl;
    4470     //} else
     4403    //} else 
    44714404    {
    44724405      // increase adaptive order by one
    44734406      Walker->GetTrueFather()->AdaptiveOrder++;
    44744407      Order = Walker->AdaptiveOrder = Walker->GetTrueFather()->AdaptiveOrder;
    4475 
     4408 
    44764409      // initialise Order-dependent entries of UniqueFragments structure
    44774410      FragmentSearch.BondsPerSPList = (bond **) Malloc(sizeof(bond *)*Order*2, "molecule::PowerSetGenerator: ***BondsPerSPList");
     
    44804413        FragmentSearch.BondsPerSPList[2*i] = new bond();    // start node
    44814414        FragmentSearch.BondsPerSPList[2*i+1] = new bond();  // end node
    4482         FragmentSearch.BondsPerSPList[2*i]->next = FragmentSearch.BondsPerSPList[2*i+1];     // intertwine these two
     4415        FragmentSearch.BondsPerSPList[2*i]->next = FragmentSearch.BondsPerSPList[2*i+1];     // intertwine these two 
    44834416        FragmentSearch.BondsPerSPList[2*i+1]->previous = FragmentSearch.BondsPerSPList[2*i];
    44844417        FragmentSearch.BondsPerSPCount[i] = 0;
    4485       }
    4486 
     4418      } 
     4419 
    44874420      // allocate memory for all lower level orders in this 1D-array of ptrs
    44884421      NumLevels = 1 << (Order-1); // (int)pow(2,Order);
     
    44904423      for (int i=0;i<NumLevels;i++)
    44914424        FragmentLowerOrdersList[RootNr][i] = NULL;
    4492 
     4425     
    44934426      // create top order where nothing is reduced
    44944427      *out << Verbose(0) << "==============================================================================================================" << endl;
    44954428      *out << Verbose(0) << "Creating KeySets of Bond Order " << Order << " for " << *Walker << ", " << (RootStack.size()-RootNr) << " Roots remaining." << endl; // , NumLevels is " << NumLevels << "
    4496 
     4429 
    44974430      // Create list of Graphs of current Bond Order (i.e. F_{ij})
    44984431      FragmentLowerOrdersList[RootNr][0] =  new Graph;
     
    45074440        // we don't have to dive into suborders! These keysets are all already created on lower orders!
    45084441        // this was all ancient stuff, when we still depended on the TEFactors (and for those the suborders were needed)
    4509 
     4442       
    45104443//        if ((NumLevels >> 1) > 0) {
    45114444//          // create lower order fragments
     
    45144447//          for (int source=0;source<(NumLevels >> 1);source++) { // 1-terms don't need any more splitting, that's why only half is gone through (shift again)
    45154448//            // step down to next order at (virtual) boundary of powers of 2 in array
    4516 //            while (source >= (1 << (Walker->AdaptiveOrder-Order))) // (int)pow(2,Walker->AdaptiveOrder-Order))
     4449//            while (source >= (1 << (Walker->AdaptiveOrder-Order))) // (int)pow(2,Walker->AdaptiveOrder-Order))   
    45174450//              Order--;
    45184451//            *out << Verbose(0) << "Current Order is: " << Order << "." << endl;
     
    45214454//              *out << Verbose(0) << "--------------------------------------------------------------------------------------------------------------" << endl;
    45224455//              *out << Verbose(0) << "Current SubOrder is: " << SubOrder << " with source " << source << " to destination " << dest << "." << endl;
    4523 //
     4456//       
    45244457//              // every molecule is split into a list of again (Order - 1) molecules, while counting all molecules
    45254458//              //*out << Verbose(1) << "Splitting the " << (*FragmentLowerOrdersList[RootNr][source]).size() << " molecules of the " << source << "th cell in the array." << endl;
     
    45524485      RootStack.push_back(RootKeyNr); // put back on stack
    45534486      RootNr++;
    4554 
     4487 
    45554488      // free Order-dependent entries of UniqueFragments structure for next loop cycle
    45564489      Free((void **)&FragmentSearch.BondsPerSPCount, "molecule::PowerSetGenerator: *BondsPerSPCount");
     
    45584491        delete(FragmentSearch.BondsPerSPList[2*i]);
    45594492        delete(FragmentSearch.BondsPerSPList[2*i+1]);
    4560       }
     4493      } 
    45614494      Free((void **)&FragmentSearch.BondsPerSPList, "molecule::PowerSetGenerator: ***BondsPerSPList");
    45624495    }
     
    45694502  Free((void **)&FragmentSearch.ShortestPathList, "molecule::PowerSetGenerator: *ShortestPathList");
    45704503  delete(FragmentSearch.FragmentSet);
    4571 
    4572   // now, FragmentLowerOrdersList is complete, it looks - for BondOrder 5 - as this (number is the ANOVA Order of the terms therein)
     4504 
     4505  // now, FragmentLowerOrdersList is complete, it looks - for BondOrder 5 - as this (number is the ANOVA Order of the terms therein) 
    45734506  // 5433222211111111
    45744507  // 43221111
     
    45904523    RootKeyNr = RootStack.front();
    45914524    RootStack.pop_front();
    4592     Walker = FindAtom(RootKeyNr);
     4525    Walker = FindAtom(RootKeyNr); 
    45934526    NumLevels = 1 << (Walker->AdaptiveOrder - 1);
    45944527    for(int i=0;i<NumLevels;i++) {
     
    46034536  Free((void **)&FragmentLowerOrdersList, "molecule::FragmentBOSSANOVA: ***FragmentLowerOrdersList");
    46044537  Free((void **)&NumMoleculesOfOrder, "molecule::FragmentBOSSANOVA: *NumMoleculesOfOrder");
    4605 
     4538 
    46064539  *out << Verbose(0) << "End of FragmentBOSSANOVA." << endl;
    46074540};
     
    46374570  atom *Walker = NULL;
    46384571  bool result = true; // status of comparison
    4639 
    4640   *out << Verbose(3) << "Begin of IsEqualToWithinThreshold." << endl;
     4572 
     4573  *out << Verbose(3) << "Begin of IsEqualToWithinThreshold." << endl; 
    46414574  /// first count both their atoms and elements and update lists thereby ...
    46424575  //*out << Verbose(0) << "Counting atoms, updating list" << endl;
     
    46854618    if (CenterOfGravity.Distance(&OtherCenterOfGravity) > threshold) {
    46864619      *out << Verbose(4) << "Centers of gravity don't match." << endl;
    4687       result = false;
    4688     }
    4689   }
    4690 
     4620      result = false; 
     4621    }
     4622  }
     4623 
    46914624  /// ... then make a list with the euclidian distance to this center for each atom of both molecules
    46924625  if (result) {
     
    47044637      OtherDistances[Walker->nr] = OtherCenterOfGravity.Distance(&Walker->x);
    47054638    }
    4706 
     4639 
    47074640    /// ... sort each list (using heapsort (o(N log N)) from GSL)
    47084641    *out << Verbose(5) << "Sorting distances" << endl;
     
    47154648    for(int i=AtomCount;i--;)
    47164649      PermutationMap[PermMap[i]] = (int) OtherPermMap[i];
    4717 
     4650   
    47184651    /// ... and compare them step by step, whether the difference is individiually(!) below \a threshold for all
    47194652    *out << Verbose(4) << "Comparing distances" << endl;
     
    47264659    Free((void **)&PermMap, "molecule::IsEqualToWithinThreshold: *PermMap");
    47274660    Free((void **)&OtherPermMap, "molecule::IsEqualToWithinThreshold: *OtherPermMap");
    4728 
     4661     
    47294662    /// free memory
    47304663    Free((void **)&Distances, "molecule::IsEqualToWithinThreshold: Distances");
     
    47344667      result = false;
    47354668    }
    4736   }
     4669  } 
    47374670  /// return pointer to map if all distances were below \a threshold
    47384671  *out << Verbose(3) << "End of IsEqualToWithinThreshold." << endl;
     
    47434676    *out << Verbose(3) << "Result: Not equal." << endl;
    47444677    return NULL;
    4745   }
     4678  } 
    47464679};
    47474680
     
    47984731 * \param *output output stream of temperature file
    47994732 * \return file written (true), failure on writing file (false)
    4800  */
     4733 */ 
    48014734bool molecule::OutputTemperatureFromTrajectories(ofstream *out, int startstep, int endstep, ofstream *output)
    48024735{
     
    48064739  if (output == NULL)
    48074740    return false;
    4808   else
     4741  else 
    48094742    *output << "# Step Temperature [K] Temperature [a.u.]" << endl;
    48104743  for (int step=startstep;step < endstep; step++) { // loop over all time steps
Note: See TracChangeset for help on using the changeset viewer.